有人可以解释一下这个unique_ptr代码发生了什么
Can someone explain what is happening with this unique_ptr code?
这是一个
使用unique_ptr的代码:
struct Foo{
Foo(){std::cout << "Ctor calledn";}
~Foo(){std::cout << "Dtor calledn";}
void bar(){std::cout << "bar calledn";}
}
int main(){
unique_ptr<Foo> up(new Foo);
{
vector<unique_ptr<Foo>> v;
v.push_back(move(up));
}
up->bar();
return 0;
}
运行的输出为:
Ctor called
Dtor called
bar called
我期待bar()
失败的呼吁,因为据我所知,up
应该因为move
而被v
摧毁。看来我还没有正确理解。有人可以带我了解正在发生的事情吗?(g++ 4.7.0)
您看到的是未定义的行为,由上次调用up->bar()
引起。如果您尝试,它可能是一样的:
static_cast<Foo*>(0)->bar();
请注意,未定义的行为实际上意味着未定义,因此它可能会崩溃或完全出乎意料,例如看起来工作正常。编译器还可以理解永远不会到达最后一行代码(在定义的行为下),并决定生成一个根本不执行任何操作的空可执行文件。
据我所知,
up
应该因为move
而被v
摧毁。
它被摧毁了。否则为什么"Dtor called"
会显示在输出上?当析构函数执行时,对象将被销毁。没有其他魔法发生。
我期待对 bar() 的调用失败
当行为未定义时,您不能期望任何事情,这就是取消引用空unique_ptr
的情况。
相关文章:
- 为什么 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错误