【发布时间】:2021-08-24 00:25:39
【问题描述】:
我对 C++ 比较陌生,我想同时了解内存管理和指针。
假设我有下面的代码
int* p1;
int* p2;
int* p3 = new int[some size];
p1 = p3;
std::swap(p1,p2);
如何正确删除动态分配的内存?做delete[] p3 够吗?之后我也应该删除p2吗?
【问题讨论】:
-
Is doing delete[] p3 enough?是的。Should I delete p2 too after that?没有。 -
我主张在 2021 年为任何新的 C++ 开发人员从一开始就使用 C++ 智能指针,除非出于教学目的要求。
-
在
std::swap(p1,p2);之前确保您执行p2 = nullptr;,否则交换将执行未定义的行为。 -
这样想:分配的内存是一辆汽车,一些指向该内存的指针就像打开同一辆车的几把钥匙。一旦你摧毁了汽车(通过使用钥匙设置炸弹),其余的钥匙就没有用了;最糟糕的是:它们指向一个被破坏的物体,所以不要试图再次爆炸它。
-
通过哪个指针删除动态分配的内存并不重要,您可以使用
p2或p3中的一个 - 但不能同时使用两者。一旦内存被删除,all 指向的指针就会失效。在新分配之前仍在阅读是未定义的行为。无论如何你都有UB,因为你在传递给std::swap时正在读取未初始化的p2指针。为避免,请为其分配一个值,例如。 G。nullptr.
标签: c++ pointers memory-management