C++ 为什么不使用std::move就可以将std::unique\u ptr复制到另一个文件中?
除非使用std::unique\u ptr,否则不应将std::unique\u ptr复制到另一个std::unique\u ptr,对吗 但我经历过类似的事情C++ 为什么不使用std::move就可以将std::unique\u ptr复制到另一个文件中?,c++,std,unique-ptr,C++,Std,Unique Ptr,除非使用std::unique\u ptr,否则不应将std::unique\u ptr复制到另一个std::unique\u ptr,对吗 但我经历过类似的事情 #include <iostream> #include <memory> using namespace std; class ClassA{ public: ClassA() { cout << "created" << endl; }
#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;
}
ClassA被摧毁了两次,这是怎么发生的?它是否应该因为没有要删除的内容而崩溃 当您执行std::unique\u ptr d&aa;,您正在使用原始指针创建d。unique_ptr构造函数看不到您正在向它传递指向另一个std::unique_ptr已拥有/管理的对象的指针
因此,双重删除会导致未定义的行为,即任何事情都可能发生。当您执行std::unique\u ptr d&aa;,您正在使用原始指针创建d。unique_ptr构造函数看不到您正在向它传递指向另一个std::unique_ptr已拥有/管理的对象的指针
因此,双重删除会导致未定义的行为,即任何事情都可能发生。考虑一下名称。如果你能复制一个东西,它仍然是唯一的吗;将是不同的-那么d指的是自动存储,当它试图删除该存储时,将导致未定义的行为。这两种情况都是UB,但出于不同的原因,请思考名称。如果你能复制一个东西,它仍然是唯一的吗;将是不同的-那么d指的是自动存储,当它试图删除该存储时,将导致未定义的行为。这两个案例都是UB,但原因不同,我现在明白了。我担心的一个问题是双重删除不会崩溃或产生任何问题,那么如果编写此错误,则很难捕获。@xkimi初始化命名引用时,您必须始终考虑对象的生存期。该引用可能比原始对象的生命周期长,而原始对象的生命周期由其他对象控制manner@M.M我发现了一些有趣的东西。我仍然可以在对象获取后调用printreset@xkimi未定义的行为意味着任何事情都可能发生,因此您的打印不会以任何方式引用对象,因此崩溃的可能性较小。如果您有一个成员变量,并且打印了它,它可能会崩溃,但是作为UB,它可能会工作,或者打印一些垃圾值……我现在明白了。我担心的一个问题是双重删除不会崩溃或产生任何问题,那么如果编写此错误,则很难捕获。@xkimi初始化命名引用时,您必须始终考虑对象的生存期。该引用可能比原始对象的生命周期长,而原始对象的生命周期由其他对象控制manner@M.M我发现了一些有趣的东西。我仍然可以在对象获取后调用printreset@xkimi未定义的行为意味着任何事情都可能发生,因此您的打印不会以任何方式引用对象,因此崩溃的可能性较小。如果您有一个成员变量并打印了它,它可能会崩溃,但作为UB,它可能会工作,或者打印一些垃圾值。。。
created
ok
ok
destroyed
destroyed