简体   繁体   English

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

[英]Writing safe copy-constructor with smart pointer

I'm trying to figure out is it possible to write a safe copy constructor with help of std::unique_ptr inside. 我试图弄清楚是否可以在std::unique_ptr里面编写一个安全的拷贝构造函数。
This is my code: 这是我的代码:

#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;
}

And the output for this code: 以及此代码的输出:

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

So, the question is why does A destructor not called? 所以,问题是为什么没有调用析构函数?
As I suppose, std::unique_ptr<A> _a will go out of the scope and object should be destroyed. 正如我想的那样, std::unique_ptr<A> _a将超出范围,对象应该被销毁。

Stack unwinding is only guaranteed if the exception is ever caught. 只有在捕获到异常时才能保证堆栈展开。 If you add a try-catch block to your main , you will see that the destructors get called correctly. 如果向main添加try-catch块,您将看到析构函数被正确调用。

[Live example] [实例]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM