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