我有以下代码片段:
#include
using namespace std;
class A {
int* data;
int size;
public:
A(int s):size(s)
{
data = new int[size];
}
A() {
data = nullptr;
}
~A() {
if (data) delete [] data;
}
};
class B {
A a[2];
public:
B() {
a[0] = A(10);
a[1] = A(11);
}
};
int main(int argc, char *argv[]) {
B b;
}
在上面的C代码中,我有一个类A,它有一个数组成员int * data,而(de)内存的分配由(de)构造函数处理.我创建了B类,它有一个固定长度的A类数组作为数据成员.
我的问题是:如何优雅地初始化成员A a [2]?在上面的代码中,A(10)和A(11)是在堆栈上创建的,当跳出作用域时,它们的析构函数将被调用,因此数据无效.当跳转主函数的作用域时,[2]持有的指针将被释放两次,导致错误:
正在释放的指针未分配.
一种可能的解决方案是仔细设计复制构造函数和移动构造函数,通过这样做,上述编码范例可以工作.
我尝试过的另一个解决方案是在B类的初始化列表中初始化数组:
B() : a { A(10), A(11) }
这个解决方案有效,我并没有真正告诉初始化列表的基本机制.我认为它必须与简单的构造和复制完全不同.我真的希望有些专家能够详细解释这种机制.当然,这种解决方案难以编码且不灵活.
所以我想知道C中是否有一些编程范例可以解决这个设计问题?