异常安全构造函数

Exception safety constructor

本文关键字:构造函数 安全 异常      更新时间:2023-10-16

在我的小程序中,我需要有一个带有一些动态分配数据的类,比如这个:

class MyClass
{
public:
  MyClass(size_t aSize1, size_t aSize2)
    :mX1(new char[aSize1]),
    mX2(new char[aSize2])
  {}
  ~MyClass()
  {
    delete[] mX1;
    delete[] mX2;
  }
...
private:
  MyClass(const MyClass& aObj);
  MyClass& operator=(const MyClass& aObj);
private:
  char* mX1;
  char* mX2;
};

第一个问题是,如果我应该使用原始指针,那么类的构造函数是否安全?我的意思是,如果new在为mX2分配内存时抛出异常,会有什么麻烦吗?在这种情况下,已经分配给mX1的内存是否会泄漏或被正确删除?

第二个问题是,什么会更好——使用一些智能指针(例如unique_ptr)或使用stl容器(例如vector)来保存动态数组?

UPD。如果我将使用unique_ptr,std::unique_ptr<char[]> mX1;,我应该如何实现复制构造函数?

  1. 在构造函数中处理异常是个好主意。但当你的记忆力耗尽时,你就陷入了没有某种乐器的困境。你几乎无能为力
  2. 使用智能指针/矢量等。省去生活中的麻烦