这是怎样的一个初学者问题的数组,但我没有做过C++在很长一段时间,所以这里去...动态分配对象
我有一个包含一个动态分配的数组类,说
class A
{
int* myArray;
A()
{
myArray = 0;
}
A(int size)
{
myArray = new int[size];
}
~A()
{
// Note that as per MikeB's helpful style critique, no need to check against 0.
delete [] myArray;
}
}
但现在我想创建一个动态分配这些类的数组。这是我目前的代码:
A* arrayOfAs = new A[5];
for (int i = 0; i < 5; ++i)
{
arrayOfAs[i] = A(3);
}
但是这个爆炸非常严重。由于在for
循环迭代完成时创建的新对象A
(使用A(3)
调用)遭到破坏,这意味着该实例的内部myArray
得到了delete []
-ed。
所以我认为我的语法一定是非常错误的?我想有几个修复看起来像矫枉过正,我希望避免:
- 为
A
创建复制构造函数。 - 使用
vector<int>
和vector<A>
所以我不必担心这一切。 - 而不是
arrayOfAs
是A
对象的数组,请将其指定为A*
指针的数组。
我会认为这只是一些初学者的事情,当尝试动态分配一组具有内部动态分配的事物时,实际上有一种语法。
(另外,风格的批评赞赏,因为它已经,因为我做了C++一段时间。)
更新未来观众:以下所有的答案都非常有帮助。由于示例代码和有用的“4规则”,Martin's被接受,但我真的建议阅读它们。有些是很好的,简短的说错了什么,有些正确指出如何以及为什么是一个好的方法。
其实这个使用赋值运算符而不是拷贝构造函数。左手边已经完全建成。 – 2008-11-01 16:47:14
哎呀,脑屁。感谢您的支持。固定。 – 2008-11-01 21:32:32
不幸的不是。因为原始A(3)和arrayofAs [i]都包含指向堆上同一区域的成员myArray。第一个超出范围将删除该对象。第二个超出范围也会删除它,这会导致问题。 – 2008-12-13 20:33:57