安全数组删除

时间:2015-06-25 15:12:26

标签: c++ arrays

我是C ++的新手,我并不完全确定如何以安全的方式处理数组和指针。在我的课堂上,我有一个名为 items 的成员:

Item * items;

在我的类方法中称为 read()我打开一个文件并从该文件中读取项目。我相应地分配空间:

items = new Item[item_count];

item_count作为文件中的变量提供,并在创建任何项目之前提前读取。在我班上的解构器中,我再次释放这样的记忆:

delete[] items;

但是如果我在执行解构函数之前两次调用方法read(),则第一个数组的内存将无法正确释放。我想在分配新内存之前事先在read方法中释放它。但是,如何检查是否已为阵列items分配了一些内存?

编辑:我知道还有很多其他的可能性,采用更“现代”的方法和更舒适的解决方案。但在这种情况下,我们明确地告诉我们使用指针和数组(仅限教育目的)。

3 个答案:

答案 0 :(得分:8)

在现代C ++中,"安全的方式"是完全避免原始指针和原始数组。

声明你的变量:

std::vector<Item> items;

像这样分配空间:

items.resize(item_count);

在类的解构函数中,不需要代码来释放此内存。它会自动处理。

您在问题中描述的items的重复使用将有效。

答案 1 :(得分:6)

除非你有充分理由不这样做,否则只需在C ++中使用 std::vector 表示数组:

#include <vector>  // for std::vector

....
std::vector<Item> items;

通过这种方式,您无需明确调用delete[]来释放矢量项&#39;资源;由于矢量&(&#39;)析构函数,它已经自动

这有助于构建在结构上无法泄露资源的代码

您可以使用以下内容创建itemCount Items的向量:

std::vector<Item> items(itemCount);

或者您可以使用其resize()方法动态调整矢量大小,例如:

items.resize(itemCount);

答案 2 :(得分:2)

在c中,通常将指针初始化为NULL,以便检查它是否指向有效内存,然后在取消分配后立即将其设置回NULL

如果不这样做,可能会导致问题,例如取消引用已经解除分配的指针(他们被称为悬空指针 ),所以你必须小心。< / p>

在c ++中,您应该使用nullptr,这相当于c NULL

此外,c ++中有smart pointers,即指针可以自动执行此操作。

修改 :( 上面的答案已被编辑),如评论中所建议的那样,尽管同样的想法是正确的,但您不应该使用NULL c ++,而是使用具有相同功能的nullptr,但要注意c ++中void *不会自动转换为c中的任何其他指针类型。

Stack Overflow Answer包含详细信息,也是一个明确说服您和我使用nullptr的示例。