【发布时间】:2020-06-15 05:26:01
【问题描述】:
除非你使用 std::move,否则不应将 std::unique_ptr 复制到另一个 std::unique_ptr,对吗?
但我经历过这样的事情。
#include <iostream>
#include <memory>
using namespace std;
class ClassA{
public:
ClassA() {
cout << "created" << endl;
}
~ClassA() {
cout << "destroyed" << endl;
}
void print() {
cout << "ok" << endl;
}
};
void test() {
unique_ptr<ClassA> b(new ClassA());
b->print();
// unique_ptr<ClassA> d(b); this won't compile since you can't copy unique_ptr
ClassA& aa = *b; // ClassA aa = *b; works too.
unique_ptr<ClassA> d(&aa); // but this can, why is that
d->print();
}
int main(int argc, char *argv[])
{
test();
return 0;
}
程序运行正常,输出为:
created
ok
ok
destroyed
destroyed
ClassA 被摧毁了两次,这是怎么回事?它应该因为没有可删除的内容而崩溃吗?
【问题讨论】:
-
想想名字。如果你可以复制一些东西,它仍然是独特的吗?
-
ClassA aa = *b;会有所不同——然后d指的是自动存储,并且在尝试删除该存储时会导致未定义的行为。两种情况都是UB,但原因不同
标签: c++ std unique-ptr