2

我正在尝试动态创建一个指针数组。从我读到现在的内容,这可以在 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

4 回答 4

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);
于 2013-08-20T12:20:07.460 回答
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>会是合理的和更好的。

于 2013-08-20T12:20:44.953 回答
1

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

于 2013-08-20T12:21:25.973 回答
0

您应该使用对它们来说是完美用法的 typedef。

typedef CPoint* PCPoint;

在此之后将 PCPoint 视为数组。

于 2013-08-20T12:36:07.023 回答