我是C ++的新手,我并不完全确定如何以安全的方式处理数组和指针。在我的课堂上,我有一个名为 items 的成员:
Item * items;
在我的类方法中称为 read()我打开一个文件并从该文件中读取项目。我相应地分配空间:
items = new Item[item_count];
item_count
作为文件中的变量提供,并在创建任何项目之前提前读取。在我班上的解构器中,我再次释放这样的记忆:
delete[] items;
但是如果我在执行解构函数之前两次调用方法read()
,则第一个数组的内存将无法正确释放。我想在分配新内存之前事先在read方法中释放它。但是,如何检查是否已为阵列items
分配了一些内存?
答案 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
的示例。