Redian新闻
>
老年工程师转行学C++的更新的问题
avatar
老年工程师转行学C++的更新的问题# Programming - 葵花宝典
p*2
1
看了原帖,直流口水
http://www.mitbbs.com/article_t/Food/31427359.html
今天就赶紧买了all purpose powder过来依样画葫芦。
叫老公用俩筷子搅面,他直在那叫爹骂娘。说这个难度太高。为啥不用手揉。我说不知
道。他说生气了,手痛死了,不想吃了。不理他,我忙我的。
忘了醒面团了,不知道这个过程有多重要。
第一拨杆得太薄了,我以为越薄越好,结果不是,都成了一口一个的小饼了都。后然杆
厚一点就好多了。下回更厚!
盐撒少了,没啥咸味。秘诀撒面粉也撒少了,没有分层。在扭面团的时候我觉得还是粘
合两端再扭比较好。不然葱油露在外面也不好杆成饼啊。
我用medium火候,发现不够,面上烤焦了,里面也没好啊,黏黏的里面。后然用medium
high,看到面饼会鼓起来,狠happy。
饼煎好了后,老公不声不响偷走吃了。
给大家一些经验教训,饼很丑,就不上片片了。
avatar
c*4
2
最近看中了一房子,离高压线有3个block,六排房子的距离。请问这样的房子有什么问
题吗?
谢谢
avatar
H*y
3
avatar
b*i
4
这次是关于SWIG的,这是一种模板语言,用来和python等协作。比如,把C++的dll变成
pyd,可以自动完成很多补充的工作。
现在有这样一个发现,在python里面
a = cppapi.return_obj() C++函数返回一个对象,这个对象是python控制内存的
b = cppapi.return_ptr() c++函数返回一个指针,我认为python只控制这个指针的值
,不控制内存
我的问题是,如果
c = cppapi.return_obj2() 这里的C++函数这样写的:
Obj return_obj2(){
return * return_ptr();
}
这个方法的话,python的变量C来控制内存?就是说,不用的时候python负责释放内存。
我这个工作是不是和潮流反其道而行啊?大家都javascript了,我还C++?
avatar
F*t
5
沙发
恭喜
avatar
H*y
6
avatar
c*1
7
你可返回一个大内存,便于观察,python是否release the memory

【在 b***i 的大作中提到】
: 这次是关于SWIG的,这是一种模板语言,用来和python等协作。比如,把C++的dll变成
: pyd,可以自动完成很多补充的工作。
: 现在有这样一个发现,在python里面
: a = cppapi.return_obj() C++函数返回一个对象,这个对象是python控制内存的
: b = cppapi.return_ptr() c++函数返回一个指针,我认为python只控制这个指针的值
: ,不控制内存
: 我的问题是,如果
: c = cppapi.return_obj2() 这里的C++函数这样写的:
: Obj return_obj2(){
: return * return_ptr();

avatar
y*o
8
lol

饼煎好了后,老公不声不响偷走吃了。

【在 p********2 的大作中提到】
: 看了原帖,直流口水
: http://www.mitbbs.com/article_t/Food/31427359.html
: 今天就赶紧买了all purpose powder过来依样画葫芦。
: 叫老公用俩筷子搅面,他直在那叫爹骂娘。说这个难度太高。为啥不用手揉。我说不知
: 道。他说生气了,手痛死了,不想吃了。不理他,我忙我的。
: 忘了醒面团了,不知道这个过程有多重要。
: 第一拨杆得太薄了,我以为越薄越好,结果不是,都成了一口一个的小饼了都。后然杆
: 厚一点就好多了。下回更厚!
: 盐撒少了,没啥咸味。秘诀撒面粉也撒少了,没有分层。在扭面团的时候我觉得还是粘
: 合两端再扭比较好。不然葱油露在外面也不好杆成饼啊。

avatar
H*y
9
avatar
j*g
10
loop 100 times
avatar
H*y
11
avatar
t*n
12
刷题转码 工资翻倍
avatar
H*y
13
avatar
m*5
14
What you said is correct in default cases. The return_obj2 actually returned
a value not reference. So for sure for this copy of Obj the memory is
handled by python as default if you did not change the thisown flag. However
, you still need to manage the C++ copy of object (the return_ptr pointed to
). According to my experience, the C++ copy can be optimized away during
compiling in some cases, but this is special cases and no guarantee. If you
want the python handle the C++ created instance, you need make sure by
yourself that there is no other piece of code refer to that instance after
passing to python and manually change the thisown flag.

【在 b***i 的大作中提到】
: 这次是关于SWIG的,这是一种模板语言,用来和python等协作。比如,把C++的dll变成
: pyd,可以自动完成很多补充的工作。
: 现在有这样一个发现,在python里面
: a = cppapi.return_obj() C++函数返回一个对象,这个对象是python控制内存的
: b = cppapi.return_ptr() c++函数返回一个指针,我认为python只控制这个指针的值
: ,不控制内存
: 我的问题是,如果
: c = cppapi.return_obj2() 这里的C++函数这样写的:
: Obj return_obj2(){
: return * return_ptr();

avatar
H*y
15
avatar
b*i
16
很好。现在发现我们的Python代码很多次使用了C++返回的指针,然后传给一个C++函数
来构造智能指针。这样是不对的
for..
xx = dict.get_somethin(...)
reg = ...
reg.add(xx)
我提出的解决方案是,进行复制。幸好我们的类都有Copy这个函数。
for..
xx = dict.get_somethin(...)
reg = ...
reg.add(xx.Copy())
现在的问题是,在SWIG怎么做?
%newobject *::Copy;
对吗?怎么才能知道是不是对的?在cxx文件能看到有什么改变吗?还是在py文件里可
以看到?

returned
However
to
you

【在 m********5 的大作中提到】
: What you said is correct in default cases. The return_obj2 actually returned
: a value not reference. So for sure for this copy of Obj the memory is
: handled by python as default if you did not change the thisown flag. However
: , you still need to manage the C++ copy of object (the return_ptr pointed to
: ). According to my experience, the C++ copy can be optimized away during
: compiling in some cases, but this is special cases and no guarantee. If you
: want the python handle the C++ created instance, you need make sure by
: yourself that there is no other piece of code refer to that instance after
: passing to python and manually change the thisown flag.

avatar
H*y
17
avatar
i*s
18
如果是在C++内生成的对象的指针,需要回到C++代码中去处理。
可以把指针传给PY代码,但是PY把这个指针作为一个特殊类型的数据来传递。当传递回
给C++代码之后,C++代码需要最后回收这个指针。
我怎么觉得你第一段代码看起来是对的?(如果最后在reg相应的C++代码里把指针回收
)。

【在 b***i 的大作中提到】
: 很好。现在发现我们的Python代码很多次使用了C++返回的指针,然后传给一个C++函数
: 来构造智能指针。这样是不对的
: for..
: xx = dict.get_somethin(...)
: reg = ...
: reg.add(xx)
: 我提出的解决方案是,进行复制。幸好我们的类都有Copy这个函数。
: for..
: xx = dict.get_somethin(...)
: reg = ...

avatar
H*y
19
avatar
b*i
20
问题在于swig负责衔接,如果返回指针,那么swig默认C++传出的指针不应由swig来销
毁,就像vector删掉元素并不销毁内存一样,所以Python的变量如果出范围是
不会调用swig来销毁这个空间的。
返回对象则默认Python应该负责销毁,所以swig会帮助进行销毁。指针也可以达到类似
的效果,要使用%newobject cppapi::ReturnObj();
那么swig就认为C++把所有权交给了python,
a=cppapi.return_obj()就获得了所有权(swig设的域thisown)
当变量a出范围后,Python就可以告诉swig,swig再调用析构函数。

【在 i********s 的大作中提到】
: 如果是在C++内生成的对象的指针,需要回到C++代码中去处理。
: 可以把指针传给PY代码,但是PY把这个指针作为一个特殊类型的数据来传递。当传递回
: 给C++代码之后,C++代码需要最后回收这个指针。
: 我怎么觉得你第一段代码看起来是对的?(如果最后在reg相应的C++代码里把指针回收
: )。

avatar
H*y
21
avatar
H*y
22
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。