c++ - C++:默认析构函数:它会删除成员指针指向的数组吗?
问题描述
如果我这样声明 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
MyObj testObj;
testObj.makeArray();
delete testObj;
因为 testObj 不是由使用运算符 new 分配的内存地址分配的指针。
您需要在类定义中至少添加一个初始化器和析构器
class MyObj {
private:
uint8_t *arrayPtr = nullptr;
public:
~MyObj() { delete [] arrayPtr; }
void makeArray();
};
请注意,您应该将复制构造函数和复制赋值运算符定义为已删除,或者您必须显式定义它们。
还要记住,函数 makeArray 是不安全的。如果用户第二次调用它,就会出现内存泄漏,因为之前分配的内存不会被删除。
而且您没有数组作为该类的数据成员。你有一个指针。该指针将与包含该指针的对象一起从堆栈中释放。但是,如果不调用运算符 delete [],则不会释放动态分配的数组。
推荐阅读
- google-cloud-platform - PCI DSS 2020 Google Cloud 官方文档
- r - 一个节点产生错误:已达到超时:[www.website.com] 连接在 10001 毫秒后超时
- python - 在以 r+ 模式写入后使用 f.read 和 f.readline 时,Python 输出会发生变化
- python - 使用 for 循环 python 创建和修改数据框
- json - 从 SQL Server 2019 数据库表中的 json 字符串中提取多个值/级别
- javascript - 从 sequelize 中的现有模型创建迁移文件
- c++ - 带有 If 语句的 C++ 变量赋值
- node.js - React 应用程序未使用终端安装
- python - 如何构造一个使用 Python 中其他包中的函数的函数?
- reactjs - React 中的状态未按预期更新