当前位置:  开发笔记 > 编程语言 > 正文

结构数组和新/删除

如何解决《结构数组和新/删除》经验,为你挑选了2个好方法。

我有这样的结构:

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?



1> Jeremy Ruten..:

您需要delete在将其设置为NULL之前调用.(不需要将其设置为NULL,如果在删除指针后意外尝试取消引用,它只会有助于减少错误.)

请记住,每次使用时new,您都需要delete稍后使用相同的指针.不要使用另一个.

此外,new []delete []一起去以同样的方式,但你千万不要混合new []使用deletenew使用delete [].在您的示例中,由于您使用new(而不是new []创建对象数组)创建了对象,因此必须使用delete(而不是delete [])删除对象.



2> Pyry Jahkola..:

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

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有