指向STL容器的指针安全吗?

4
如果我让一个 unique_ptr 指向一个STL容器的实例,像下面这样?这段代码是否安全?
unique_ptr< vector<int> > p1( new vector<int> );

这样做会导致vector<int>的析构函数被调用两次,因为vector<int>本身和unique_ptr都试图清理vector<int>已经获取的内存。这可能导致未定义的行为吗?还是编译器会知道vector<int>已经释放了其内存,并且不会为了unique_ptr离开作用域而再次调用析构函数?简单来说,如果有人愚蠢到这样做,会不会很危险?

5
你的代码没什么不安全的问题,但你很可能并不需要unique_ptr<vector<int>> - Praetorian
1个回答

6
通过使用 unique_ptr< vector<int> > p1( new vector<int> );unique_ptr 将会在 vector 上调用 delete。这时,vector 的析构函数将释放其自己分配的内存。因此,它是安全的。
但是,vector<int> 已经足够了。我没有看到任何需要使用 unique_ptr< vector<int> > 的情况。

@FirstJens 第二次调用会来自哪里? - Sami Kuhmonen
1
@FirstJens 是的,它会。 - Sami Kuhmonen
1
@FirstJens:无论是否有原始指针指向它,都没有关系。重要的是您是否使用“new”分配了它。 - Benjamin Lindley
1
当你使用new分配内存时,你所分配的东西没有作用域,因此永远不会超出作用域。 new返回的裸指针确实超出了作用域,但是裸指针在被销毁时并不执行任何操作。 - David Schwartz
1
David所说的是正确的,但要充分理解它,您需要了解范围(这是变量拥有的东西,或者更准确地说,是名称拥有的东西)和生命周期(这是对象拥有的东西)之间的区别。使用new分配的类型为vector<int>的对象不是变量,因此它没有作用域。 - Steve Jessop
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接