为什么匿名unique_ptr值会立即被破坏
Why does anonymous unique_ptr value get destructed instantly
如果对象unique_ptr<A>
是匿名传递的(或者根本不传递给变量(,它的行为如何。如何才能知道unique_ptr是否有来自c'tor的引用(它被设置到命名变量中(。
基本上,该示例显示直接从返回值对象调用方法get((方法。
class A
{
public:
A(int a):_a(a) {}
~A() { std::cout << "d'tor A " << _a << std::endl; }
int _a;
};
std::unique_ptr<A> f1()
{
auto p1 = std::make_unique<A>(1);
return p1;
}
A *f2()
{
A * x = std::make_unique<A>(2).get(); // d'tor called 2
std::cout << x->_a << std::endl; // this will print 2 although destructed.
return x;
}
A *f3()
{
return std::make_unique<A>(3).get(); // d'tor called 3
}
int main(int argc, const char * argv[]) {
auto a=f1();
auto b=f2();
auto c=f3();
return 0;
} // d'tor called 1
在上面的代码中,我理解d'tor A 1
调用的定时,因为当退出唯一引用器(由局部变量a
表示(被破坏的块时。
但我不理解其他两个流(在创建行调用的d'tor A 2
和d'tor A 3
,请参见示例(。这是否意味着在这些情况下,引用计数从第一位开始为0,或者它上升到1,然后立即减少。
p.S
这个案件引起了我的兴趣,虽然它与任何真实的案件都无关,但它澄清了我偶然处理的一个概念。
之所以会发生这种情况,是因为我转换了java脚本,在该脚本中,它被用来创建一个成员,并在没有中间变量的情况下使用它(例如a().b().c()
而不是_a=a(); _b=_a.b(); _c=_b.c()
(,而我在c++代码中意外地使用了这种表示法。
您混淆了std::unique_ptr
及其管理的对象的生存期,以及使用它的get
方法可以获得的指针的生存期。
std::unique_ptr
是动态分配对象的唯一所有者,当它的析构函数被调用时,它将在它所持有的指针上调用deleter辅助函数(在std::make_unique
的情况下,它将只调用delete
或delete[]
,在这种情况下以合适的为准(
在第一种情况下,变量a
的类型是std::unique_ptr<A>
,std::unique_ptr
位于堆栈上(由于复制省略,您不必调用std::move
(,当main
函数完成时,它将从堆栈中删除,调用析构函数,并删除对象,这是我们在使用std::unique_ptr
时通常想要的行为。
第二种和第三种情况是一样的,第二种情况只是引入了一个临时变量,但它不会改变任何东西。
A * x = std::make_unique<A>(2).get();
当这样调用时,您将创建一个临时std::unique_ptr<A>
,并在此临时上调用get
方法,该方法返回托管指针的副本。问题是临时std::unique_ptr<A>
在行的末尾被销毁,并且您的指针正在悬挂,它已经被删除。取消引用它并在中使用它是未定义的行为,任何事情都可能发生。
第三种情况是一样的,临时std::unique_ptr
,你得到了它的指针,但临时被删除了,所以在它管理的对象上调用delete,我们有一个危险的指针。
无论何时有智能指针,都不要对临时指针调用get
,首先将临时指针存储在本地变量中,这样当您仍在使用它所管理的指针时,它就不会超出范围。
- 为什么 std::unique 不调用 std::sort?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 生成"unique"矩阵
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 我对 std::unique(算法)C++有问题
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- std::shared_ptr::unique(),复制和线程安全
- 如何在C++03中用自定义谓词调用std::unique
- C++中的指针否定 (!ptr == NULL)
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误