N***m 发帖数: 4460 | 1 看来基本概念要深抓:)
我从effective c++上看得,自己略为改动一下用auto_ptr,
可是我必须加上 最后一句 pc = ... 不然double free error.
但是这样写也太ugly了。又没有啥好办法?
另外,书上的member function template我这里编译不通过阿。
又没有啥解决的办法啊?我用的gcc 4.4。
注释掉的member function template as follows:
// template
// operator SmartPointer()
// {
// return SmartPointer(ptr);
// }
另外还有specialized的version,都不work。
==================================================
#include
#include
using namespace std;
class MusicProduct {
pr |
X****r 发帖数: 3557 | 2 Play(auto_ptr(&(*pc)),3);
Now think about why you use "&(*pc)", and what it actually does.
【在 N***m 的大作中提到】 : 看来基本概念要深抓:) : 我从effective c++上看得,自己略为改动一下用auto_ptr, : 可是我必须加上 最后一句 pc = ... 不然double free error. : 但是这样写也太ugly了。又没有啥好办法? : 另外,书上的member function template我这里编译不通过阿。 : 又没有啥解决的办法啊?我用的gcc 4.4。 : 注释掉的member function template as follows: : // template : // operator SmartPointer() : // {
|
N***m 发帖数: 4460 | 3 我改成Play(auto_ptr(pc),3),好了。
尽管我不知道为什么:)
【在 X****r 的大作中提到】 : Play(auto_ptr(&(*pc)),3); : Now think about why you use "&(*pc)", and what it actually does.
|
N***m 发帖数: 4460 | 4 我”猜“:
因为compiler 看到auto_ptr就去想办法转换,所以
pc被转换成MusicProduct*传递给auto_ptr构建anonymous variable?
【在 X****r 的大作中提到】 : Play(auto_ptr(&(*pc)),3); : Now think about why you use "&(*pc)", and what it actually does.
|
I*****y 发帖数: 602 | 5 auto_ptr不适合做函数参数传递吧,这样ownership就被传寄去了。
还是用share_ptr比较保险。
另外auto_ptr和share_ptr基本可以按照指针类型数据看待,不需要引用传递,
当然引用传递也没有错。
【在 N***m 的大作中提到】 : 看来基本概念要深抓:) : 我从effective c++上看得,自己略为改动一下用auto_ptr, : 可是我必须加上 最后一句 pc = ... 不然double free error. : 但是这样写也太ugly了。又没有啥好办法? : 另外,书上的member function template我这里编译不通过阿。 : 又没有啥解决的办法啊?我用的gcc 4.4。 : 注释掉的member function template as follows: : // template : // operator SmartPointer() : // {
|
N***m 发帖数: 4460 | 6 thanks for your input.
你说得对的,我还是用share_ptr算了。
【在 I*****y 的大作中提到】 : auto_ptr不适合做函数参数传递吧,这样ownership就被传寄去了。 : 还是用share_ptr比较保险。 : 另外auto_ptr和share_ptr基本可以按照指针类型数据看待,不需要引用传递, : 当然引用传递也没有错。
|
m*****s 发帖数: 2 | 7 Play(auto_ptr(&(*pc)),3);
is equal to
Play(auto_ptr(pc.get()),3);
a temp auto_ptr is constructed which owns the underlying pointer
that pc owns. So you get double free.
Play(auto_ptr(pc),3);
calls the cctor
auto_ptr(auto_ptr<_Ty>& _Right) _THROW0()
{ // construct by assuming pointer from _Right auto_ptr
}
the ownership is actually transfered to the temp auto_ptr.
So you avoid the double free, but the pc is released, which
may not be what you expected. |
N***m 发帖数: 4460 | 8 谢谢!
似乎pc.get是win下面的?
【在 m*****s 的大作中提到】 : Play(auto_ptr(&(*pc)),3); : is equal to : Play(auto_ptr(pc.get()),3); : a temp auto_ptr is constructed which owns the underlying pointer : that pc owns. So you get double free. : Play(auto_ptr(pc),3); : calls the cctor : auto_ptr(auto_ptr<_Ty>& _Right) _THROW0() : { // construct by assuming pointer from _Right auto_ptr : }
|