结构数组和新/删除

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 []使用deletenew使用delete [].在您的示例中,由于您使用new(而不是new []创建对象数组)创建了对象,因此必须使用delete(而不是delete [])删除对象.


Pyr*_*ola 6

正如克鲁格指出的那样,你会像那样在指数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)