用智能指针编写安全的复制构造函数

问题描述:

我想弄明白是否可以在std::unique_ptr的帮助下编写一个安全的复制构造函数。
这是我的代码:用智能指针编写安全的复制构造函数

#include <iostream> 
#include <memory> 

class A { 
public: 
    A():_a(10){ 
    std::cerr << "A() constructor" << std::endl; 
    } 

    A(const A& tmp){ 
    _a = tmp._a; 
    std::cerr << "A() copy constructor" << std::endl; 
    } 

    ~A(){ 
    std::cerr << "~A()" << std::endl; 
    } 

    int _a; 
}; 

class B { 
public: 
    B():_b(5){ 
    std::cerr << "B() constructor" << std::endl; 
    } 

    B(const B& tmp){ 
    std::cerr << "B() copy constructor" << std::endl; 
    throw std::exception("exc"); 
    } 

    ~B(){ 
    std::cerr << "~B()" << std::endl; 
    } 

    int _b; 
}; 

class C { 
public: 
    C():a(nullptr),b(nullptr){ 
    std::cerr << "C() constructor" << std::endl; 
    } 
    C(const C& tmp){ 
    std::cerr << "C() copy constructor" << std::endl; 

    std::unique_ptr<A> _a(new A(*tmp.a)); 
    std::unique_ptr<B> _b(new B(*tmp.b)); 

    a = _a.release(); 
    b = _b.release(); 
    } 
    ~C(){ 
    std::cerr << "~B()" << std::endl; 
    } 

    A* a; 
    B* b; 
}; 

int main(int argc, char** argv){ 
    A a; 
    B b; 
    C c; 
    c.a = &a; 
    c.b = &b; 
    C c2(c); 
    return 0; 
} 

和输出此代码:

A() constructor 
B() constructor 
C() constructor 
C() copy constructor 
A() copy constructor 
B() copy constructor 

所以,问题是为什么析构函数不叫?我想,std::unique_ptr<A> _a将超出范围和对象应该被销毁

+0

如果你需要一个拷贝构造函数,'unique_ptr'是不是你的选择 – sp2danny

+1

的智能指针'所以,问题是为什么析构函数不叫? '因为你扔在'B'的复制构造函数中。 – 101010

+0

@ 101010尽管如此,人们仍然希望引发'_a'的驱动。 – Angew

只有在发现异常时才能保证堆栈展开。如果您向main添加try-catch块,您将看到正确调用了析构函数。

[Live example]