【发布时间】:2020-07-24 14:27:08
【问题描述】:
如果我这样声明类 MyObj:
class MyObj: {
private:
uint8_t *arrayPtr;
public:
void makeArray();
}
void MyObj::makeArray() {
arrayPtr = new uint8_t [10];
}
然后我打电话:
void func() {
MyObj testObj;
testObj.makeArray();
}
既然 func 已经运行并完成并且 testObj 可以被忘记,那么 10 字节数组是否会从堆栈中删除?还是我需要为 MyObj 创建一个显式析构函数来测试数组是否存在并在其上调用 delete 函数?
【问题讨论】:
-
是的,你需要做些
delete的事情。经验法则,没有例外,100% 保证:如果你new某事,它必须在某个时间点被删除一次。结束。 -
针对@cigien 进行了编辑以确保清晰。
-
实现这一点相当困难且容易出错。编译器需要确保它指向动态分配的内存,知道是使用
delete还是delete[],并且知道该对象是该内存块的唯一(强)所有者。这些领域的任何不确定性都会导致不正确的删除,可以说比默认情况下的内存泄漏更有害。它也将无法处理任何非内存资源。
标签: c++ pointers memory-management memory-leaks