删除动态分配的内存的最佳做法是啥?
Posted
技术标签:
【中文标题】删除动态分配的内存的最佳做法是啥?【英文标题】:What is best practice to delete dynamically allocated memory?删除动态分配的内存的最佳做法是什么? 【发布时间】:2021-07-24 07:13:51 【问题描述】:我必须使用 new
关键字多次重新分配 iScreen
和 oScreen
。
我发现在重新分配新的堆内存之前,我必须每次都 delete
他们。
对我来说,这似乎是一种不好的做法。有没有更好的方法来解决这个代码重复?
Matrix* oScreen;
Matrix* iScreen;
iScreen = new Matrix(100, 100);
oScreen = new Matrix(100, 100);
//do something with iScreen, oScreen
delete iScreen; // have to write same "delete iScreen" every single time?
iScreen = new Matrix(150, 150);
delete oScreen;
oScreen = new Matrix(150, 150);
【问题讨论】:
在我看来,最佳实践是将所有动态分配的对象保存在某种拥有容器中。主要是std::vector
或std::unique_ptr
。
退后一步。为什么要用new
关键字多次重新分配iScreen
和oScreen
?
真的需要重新分配*iScreen = Matrix(150, 150);
吗?
【参考方案1】:
如果可以,请考虑将动态对象保存在 std::vector 之类的容器中。否则,它们应该由 智能指针 管理,例如 std::unique_ptr。
std::unique_ptr<Matrix> iScreen;
iScreen = std::make_unique<Matrix>(100, 100);
// do something with iScreen
iScreen = std::make_unique<Matrix>(150, 150); // no need to delete
您不必删除旧的,智能指针会在您分配新的时自动执行。
【讨论】:
以上是关于删除动态分配的内存的最佳做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如果程序因错误而提前退出,那么释放动态分配的内存的正确方法是啥?