Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不使用std::move就可以将std::unique\u ptr复制到另一个文件中?_C++_Std_Unique Ptr - Fatal编程技术网

C++ 为什么不使用std::move就可以将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; }

除非使用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;
    }

    ~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