由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教unique_ptr vs auto_ptr
相关主题
请教几个C++问题C++ 用户定义exception的标准用法是什么?
c++ question问行C++代码
C++ 11问题:emplace_back()菜鸟读C++ STL源程序的疑问
请教C++ call-by-ref & call-by-val的问题one question about initializaiton list
*(&b1)=b编译不过,b1=b可以,区别是?[合集] 又学了一招
问个copy constructor的问题一个C++ template的问题
请教各路C++大神 为什么f(3) 输出是 'dd'C++的一个问题
请问delete的问题auto_ptr, algorithm 混用问题,大侠们救我。头疼死了!
相关话题的讨论汇总
话题: ptr话题: auto话题: unique话题: void话题: back
进入Programming版参与讨论
1 (共1页)
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里面的,当然只

1 (共1页)
进入Programming版参与讨论
相关主题
auto_ptr, algorithm 混用问题,大侠们救我。头疼死了!*(&b1)=b编译不过,b1=b可以,区别是?
请问一个implicit conversion的问题(C++)问个copy constructor的问题
怎么搞的?请教各路C++大神 为什么f(3) 输出是 'dd'
a simple question about constructor请问delete的问题
请教几个C++问题C++ 用户定义exception的标准用法是什么?
c++ question问行C++代码
C++ 11问题:emplace_back()菜鸟读C++ STL源程序的疑问
请教C++ call-by-ref & call-by-val的问题one question about initializaiton list
相关话题的讨论汇总
话题: ptr话题: auto话题: unique话题: void话题: back