1

我正在创建一个使用声明的对象数组的程序

Element * elements = new Element[number];

其中一个元素是一个class具有/需要自己的析构函数的元素。

当我去删除它时,我会只使用数组删除,并且让程序担心调用析构函数:

delete [] elements;

或者我是否使用关键字 delete 显式调用每个项目的析构函数:

for(int ii = 0; ii< ArraySize; ii++)
    delete elements[ii];
delete [] elements;

注意:我知道我可能会使用类似的东西boost::ptr_vector,但我想要类似于hashTable功能(所以 for 循环需要额外的信息,但这超出了这个问题的直接范围),这就是我使用传统数组的原因。我仍然想知道需要哪种行为来避免内存泄漏。

4

2 回答 2

3

第一个。你应该

delete [] elements;

第二个是不正确的,如果你尝试编译它应该会给你错误。

于 2012-05-03T05:01:53.973 回答
1

是的,delete [] elements;应该足够了。

您将使用第二段代码,例如:

Element **elements;

elements = new Element *[rows];
for (int i=0; i<rows; i++)
    elements[i] = new Element;

不过,这种组合很少有多大意义。至少从某种意义上说,每一行本身也是一个动态分配的数组:

elements = new Element *[rows];
for (int i=0; i<rows; i++)
    elements[i] = new Element[row_len];

在这种情况下,您的删除将类似于:

for (int i=0; i<rows; i++)
    delete [] elements[i];
delete [] elements;

但是,正如您现在所做的那样,您所说的任何内容都不能真正证明家庭滚动的动态分配是合理的。std::vector<Element> elements(number);会很好地工作。

于 2012-05-03T05:06:43.903 回答