z***u 发帖数: 105 | 1 问题:
下面的程序有什么问题?
void foo(void)
{
。。。。
vector v; //C是一个class
v.push_back(new C());
。。。。
}
答: 会有memoryleak。
问为什么可以用unique_ptr,而不能用auto_ptr呢?比如
void foo(void)
{
。。。。
vector< unique_ptr > v; //可以
//vector< auto_ptr > v; //不可以
v.push_back(new C());
。。。。
}
自己没答上来,请教为什么? |
w***g 发帖数: 5958 | 2 auto_ptr已经depreciated, 最好不要用.
主要是auto_ptr在copy的时候会偷偷transfer ownership.
而unique_ptr必须用std::move explicitly transfer ownership.
我觉得答案可能和这个有关.
【在 z***u 的大作中提到】 : 问题: : 下面的程序有什么问题? : void foo(void) : { : 。。。。 : vector v; //C是一个class : v.push_back(new C()); : 。。。。 : } : 答: 会有memoryleak。
|
l*********s 发帖数: 5409 | 3 auto_ptr cannot be implicitly casted from raw pointer. |
z***u 发帖数: 105 | 4 auto是已经过时了,但是面试的人提出来,我的感觉是只要是smart pointer应该就可
以了吧。不太清楚为什么auto不可以。
【在 w***g 的大作中提到】 : auto_ptr已经depreciated, 最好不要用. : 主要是auto_ptr在copy的时候会偷偷transfer ownership. : 而unique_ptr必须用std::move explicitly transfer ownership. : 我觉得答案可能和这个有关.
|
z***u 发帖数: 105 | 5 new C(),是explicitly call constructor啊。你说的implicitly cast能详细谈一下
么?
感觉面试的人想问关于指针ownership方面的。。。
【在 l*********s 的大作中提到】 : auto_ptr cannot be implicitly casted from raw pointer.
|
s******u 发帖数: 501 | 6 这题目扯淡么,面试的人自己屁都不懂,因为照上面写的unique_ptr<>一样编译通不过
原因跟auto_ptr一样,因为最初的STL要求copy-constructable and assignable,
unique_ptr跟auto_ptr一样不满足这两个条件。所以push_back(unique_ptr)不行,
而且push_back(C*)也不行,因为unique_ptr不提供直接从C*的implicit constructor
C++11的STL改了要求了,只要求moveable就可以了,所以在C++11下面可以写
push_back(std::move(unique_ptr));
或者直接用construct in place的
emplace_back(C*)
但是原先的push_back还是不能用,因为push_back还是要求copyable
再又说回来了,在C++11下面auto_ptr跟unique_ptr是一样可以放在STL里面的,当然只
能用std:move或者emplace_back,一样不能用push_back
最后,C++11之所以deprecate了auto_ptr最主要的是因为名字,因为auto_ptr这个名字
不会让人联想到sole ownership,所以就让大家用unique_ptr
【在 z***u 的大作中提到】 : 问题: : 下面的程序有什么问题? : void foo(void) : { : 。。。。 : vector v; //C是一个class : v.push_back(new C()); : 。。。。 : } : 答: 会有memoryleak。
|
z***u 发帖数: 105 | 7 多谢
constructor
【在 s******u 的大作中提到】 : 这题目扯淡么,面试的人自己屁都不懂,因为照上面写的unique_ptr<>一样编译通不过 : 原因跟auto_ptr一样,因为最初的STL要求copy-constructable and assignable, : unique_ptr跟auto_ptr一样不满足这两个条件。所以push_back(unique_ptr)不行, : 而且push_back(C*)也不行,因为unique_ptr不提供直接从C*的implicit constructor : C++11的STL改了要求了,只要求moveable就可以了,所以在C++11下面可以写 : push_back(std::move(unique_ptr)); : 或者直接用construct in place的 : emplace_back(C*) : 但是原先的push_back还是不能用,因为push_back还是要求copyable : 再又说回来了,在C++11下面auto_ptr跟unique_ptr是一样可以放在STL里面的,当然只
|
S****8 发帖数: 401 | 8 exactly
constructor
【在 s******u 的大作中提到】 : 这题目扯淡么,面试的人自己屁都不懂,因为照上面写的unique_ptr<>一样编译通不过 : 原因跟auto_ptr一样,因为最初的STL要求copy-constructable and assignable, : unique_ptr跟auto_ptr一样不满足这两个条件。所以push_back(unique_ptr)不行, : 而且push_back(C*)也不行,因为unique_ptr不提供直接从C*的implicit constructor : C++11的STL改了要求了,只要求moveable就可以了,所以在C++11下面可以写 : push_back(std::move(unique_ptr)); : 或者直接用construct in place的 : emplace_back(C*) : 但是原先的push_back还是不能用,因为push_back还是要求copyable : 再又说回来了,在C++11下面auto_ptr跟unique_ptr是一样可以放在STL里面的,当然只
|