最新消息:

如何正确地从动态内存中删除对象指针?

C++头文件 CPPKU 96浏览 0评论

我有一个函数,功能是:删除一个向量中存储的所有对象指针。这些指针都是使用new关键字在堆上创建的。下面是我的函数代码,运行报错
segmentation fault 11 error。

else if (command == “Clear”) { size_t allGrades = grades.size(); for (size_t i = 0; i < allGrades; ++i) { grades[0] = nullptr; delete grades[0]; } }

{ size_t allGrades = grades.size(); for (size_t i = 0; i < allGrades; ++i) { grades[0] = nullptr; delete grades[0]; } }

其中,grades变量是已在堆上分配的指针的向量。我怎么解决这个问题?

解决方案一:

grades[0] = nullptr; delete grades[0];

改成:

delete grades[i]; grades[i] = nullptr;

否则,您不会删除在grades中保存的元素(在删除之前设置为空(0),并且总是查看grades中的第一个元素),因此您将导致内存泄漏;另外,“这些指针都是使用new命令在堆上创建的”:使用new,分配的内存不会放入堆栈中。

解决方案二:

解决这个问题的简单方法是不要拥有原始指针,或者说你不需要自己用new来动态创建对象,然后在向量中存储指针。

将std::vector<Grade *>更改为std::vector<Grade>,您的代码片段将变为

else if (command == “Clear”) { grades.clear(); }

如果您确实需要动态分配Grade对象,您应该使用std::vector<std::unique_ptr<Grade>>,并使用std::make_unique 而不是new构造它们。删除方式与值存储方式下相同。

转载请注明:cppku-C++库 » 如何正确地从动态内存中删除对象指针?

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址