动态创建指针数组

时间:2013-08-20 12:13:17

标签: c++ arrays pointers dynamic-memory-allocation

我正在尝试动态创建一个指针数组。从我读到的内容到现在,这可以通过以下方式在C ++中完成

CPoint** data_temp;
data_temp = new CPoint*[an_integer]; 

我稍后会添加指向此数组的指针,该数组将指向一个对象。有些类似的东西,使用for循环

 CPoint A;
 CPoint* data = &A; //I am using just a single value but data will also be an array
*data_temp[i] = data; // where data is pointer address

现在问题是如果要释放内存我删除指针数组data_temp它是否也会删除原始对象,即A

delete[] data_temp;

我问这个是因为我需要在稍后阶段使用该对象。

4 个答案:

答案 0 :(得分:2)

如果数组包含对象本身,

delete[]将是要做的事情:这些对象将被自动销毁。但是,由于这是一个指针数组,因此您需要执行此操作将其清空:

for (int i=0; i < num_objects; i++)
{
    delete data_temp[i];
}

delete[] data_temp;

这会解除分配每个对象指向的内存,然后删除数组本身。

编辑:我刚注意到你在堆栈上分配了这些对象。如果你想像这样存储它们并自己管理内存,你应该在堆上分配它们,如下所示:

CPoint* A = new CPoint();
data_temp[i] = A;

...或者,如果你已经在堆栈上有一个CPoint并且CPoint有一个拷贝构造函数......

data_temp[i] = new CPoint(A);

答案 1 :(得分:2)

没有。它不会。应用于指针数组的delete将删除大小的数组(在您的情况下为an_integer

如果你真的想释放这些指针指向的内存,你必须经历一个for循环

for(int i = 0; i < an_integer; i++){
    delete data_temp[i];
}
//Then deallocate the array
delete[] data_temp;

这意味着在您的情况下,您不会最终“删除”堆栈上的A对象(会导致未定义的行为)。您只会删除等于机器上指针大小的内存量乘以an_integer

我会说,在你的情况下,std::vector<A>是合理的,更好的。

答案 2 :(得分:1)

不,它不会。您必须遍历指针数组并delete分配堆分配的对象(即通过调用new分配的对象)。

答案 3 :(得分:0)

你应该使用一个适合他们的typedef。

typedef CPoint* PCPoint;

此后将PCPoint视为数组。