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)
归档时间: |
|
查看次数: |
21520 次 |
最近记录: |