动态分配和释放

时间:2013-11-29 15:00:13

标签: c++

我在这里有点困惑,假设我正在制作一个容器,它可以容纳一些元素并且可以删除这些元素。

我会有一个固定的元素数组。

现在我的问题是分配和解除分配该数组和deallocatisingle元素。

1)分配

Item* data;
Container()
{
    data = new Item[size];
}

然后添加我做类似的事情:

add(Item it)
{
    data[empty++] = it;
}

现在我的问题是我已经创建了size Items allocater<T>uninitializedfill()对象,然后当我进入添加时,我在上面添加了另一个项目,所以这意味着破坏了旧的和新的接管?

我应该在阅读时更好地使用remove(Item it) { //index is item index delete data[index]; //restore contiguity to array empty--; } delete data[index]来分配所需的内存而不构建对象。

2)取消分配:

真的出现了所有困惑,删除单个元素我可以使用吗?

Item

即使Item不是指针,我也可以使用{{1}}吗?如果不是我怎么能做到这一部分呢?!

如果可以的话,如果{{1}}是一个指针,那么当我删除它时它会删除它指向的对象吗?

4 个答案:

答案 0 :(得分:0)

data = new Item[size];

这将创建一个大小为length的Items数组,并为它们返回一个poitner。这些项目将在索引0 ..(size-1)中包含。

data[empty++] = it;

假设空是&lt;大小,这会将你的一个项目猛击头部,并使用传递给add()的Item重新对其进行重新处理。如果为空&gt; =大小而不是坏事就会发生。

delete data[index];

这不是合法代码。你想要删除所有(大小)项目,直到你想删除该批次。

答案 1 :(得分:0)

使用

分配固定长度数组时
data = new Item[size];

您已在一个连续的内存块中一次性分配了数组的所有size个元素。您没有在数组中分配单个元素,也无法使用delete data[index]取消分配单个元素 - 完成后,您只能使用delete[] data释放整个数组。

如果您预计需要在数组末尾添加和删除元素,建议您改用std::vector。如果您希望在数组中的任何位置添加和删除元素,std::list可能更有意义。

答案 2 :(得分:0)

使用:

std::vector<Item> data(N);

答案 3 :(得分:0)

您必须确定Item还是引用的对象。事实上,分配和释放看起来不连贯:

new Item[size]实际上会创建大小Item(开始一起存在),而data[i] = item会复制item i Item {{1}由data解决(替换其内部值)。这样你就不会“插入”任何东西。 empty索引(错误名称......)只定义要替换的内容。

delete data[index]无效,因为data[index]不是指针(它本身是Item)。 与data = new Item[x]成对的delete[] data对将所有这些一起删除,因为它们已在一起创建。

在给定预定义大小的项目块中插入和删除项目是...无意义(如果您可以执行大小未预定义)。

您必须考虑重新分配数组,复制和移位元素。但这只不过是重新实施std::vector