Dan*_*oof 7 c++ arrays struct memory-management new-operator
我有这样的结构:
class Items
{
private:
struct item
{
unsigned int a, b, c;
};
item* items[MAX_ITEMS];
}
Run Code Online (Sandbox Code Playgroud)
假设我想'删除'一个项目,如下所示:
items[5] = NULL;
Run Code Online (Sandbox Code Playgroud)
我后来在同一个地方创建了一个新项目:
items[5] = new item;
Run Code Online (Sandbox Code Playgroud)
我还需要打电话delete[]来清理它吗?或者不需要这样,因为items[]在编译之前已知数组的边界?
将该指针设置为NULL有效还是应该在那里调用delete?
Jer*_*ten 15
您需要delete在将其设置为NULL之前调用.(不需要将其设置为NULL,如果在删除指针后意外尝试取消引用,它只会有助于减少错误.)
请记住,每次使用时new,您都需要delete稍后使用相同的指针.不要使用另一个.
此外,new []和delete []一起去以同样的方式,但你千万不要混合new []使用delete或new使用delete [].在您的示例中,由于您使用new(而不是new []创建对象数组)创建了对象,因此必须使用delete(而不是delete [])删除对象.
正如克鲁格指出的那样,你会像那样在指数5处泄漏对象.但是这个听起来好像你不应该手动执行此操作,而是在里面使用容器类Item.如果您实际上不需要将这些item对象存储为指针,请使用std::vector<item>而不是MAX_ITEMS指针数组.如果需要,您也可以随时在中间插入或删除矢量元素.
如果您需要将对象存储为指针(通常,如果struct item实际上是多态的,与示例中不同),您可以使用Boost.PtrContainer中的 boost :: ptr_vector <item> .
例:
class Items {
private:
struct item {
unsigned int a, b, c;
};
std::vector<item> items;
}
if (items.size() > 5) // (just to ensure there is an element at that position)
items.erase(items.begin() + 5); // no need to use operator delete at all
Run Code Online (Sandbox Code Playgroud)