我是C++的新手,我并不完全确定如何以安全的方式处理数组和指针.在我的班上,我有一个叫做项目的成员:
Item * items;
Run Code Online (Sandbox Code Playgroud)
在我的类方法read()中我打开一个文件并从这个文件中读取项目.我相应地分配空间:
items = new Item[item_count];
Run Code Online (Sandbox Code Playgroud)
item_count作为文件中的变量给出,并在创建任何项目之前预先读取.在我班级的解构器中,我再次释放这样的内存:
delete[] items;
Run Code Online (Sandbox Code Playgroud)
但是如果我read()在执行解构函数之前调用该方法两次,则第一个数组的内存将无法正确释放.我想在分配新内存之前事先在read方法中释放它.但是如何检查是否已为阵列分配了一些内存items?
编辑:我知道还有很多其他的可能性,更多的"现代"方法和更舒适的解决方案.但在这种情况下,我们明确告诉使用指针和数组(仅限教育目的).
在现代C++中,"安全的方法"是完全避免原始指针和原始数组.
像这样声明你的变量:
std::vector<Item> items;
Run Code Online (Sandbox Code Playgroud)
像这样分配空间:
items.resize(item_count);
Run Code Online (Sandbox Code Playgroud)
在类的解构函数中,不需要代码来释放此内存.它是自动处理的.
items您在问题中描述的重复使用将起作用.
除非你有充分的理由不这样做,否则只需std::vector在C++中使用数组:
#include <vector> // for std::vector
....
std::vector<Item> items;
Run Code Online (Sandbox Code Playgroud)
这样,您就不必显式调用delete[]释放矢量项的资源; 由于vector(和Items')的析构函数,它只是自动完成.
这有助于构建在结构上无法泄漏资源的代码.
您可以使用以下内容创建矢量itemCount Items:
std::vector<Item> items(itemCount);
Run Code Online (Sandbox Code Playgroud)
或者您可以使用其resize()方法动态调整向量的大小,例如:
items.resize(itemCount);
Run Code Online (Sandbox Code Playgroud)
在c中,通常将指针初始化为NULL,以便检查它是否指向有效内存,然后在释放后立即将其设置回NULL。
如果不这样做,可能会导致问题,例如取消引用已经释放的指针(它们称为悬空指针),因此您必须小心。
在 c++ 中,您应该使用nullptr与 c 等效的NULL.
另外,C++ 中有智能指针,即可以自动执行此操作的指针。
编辑:(上面的答案已编辑)根据评论的建议,虽然同样的想法是正确的,但您不应该NULL在 c++ 中使用,而是使用nullptr具有相同功能的,但要注意在 c++ 中void *不会自动使用转换为任何其他指针类型,如 c 中的指针类型。
这个Stack Overflow 答案有详细信息,还有一个肯定会说服你和我使用的示例nullptr。
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |