如果我这样声明类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函数?
您不得在此代码段中调用删除
MyObj testObj;
testObj.makeArray();
delete testObj;
因为testObj不是由使用运算符new分配的内存地址分配的指针。
您需要在类定义中至少添加一个初始化程序和析构函数
class MyObj {
private:
uint8_t *arrayPtr = nullptr;
public:
~MyObj() { delete [] arrayPtr; }
void makeArray();
};
请注意,您应该将复制构造函数和复制赋值运算符定义为已删除,或者必须显式定义它们。
还要记住,makeArray函数是不安全的。如果用户第二次调用它,则会发生内存泄漏,因为先前分配的内存不会被删除。