c++ - 为什么我必须释放 2D 数组两次以避免内存泄漏?
问题描述
我在分配二维数组时遇到了内存泄漏问题。
但我不明白为什么内存泄漏。
我的理由是,在 Note A 处,我已经释放了分配的内存,因为data_[0] == data_
,为什么我必须在 Note B 处释放?
class Matrix {
public:
Matrix(int r, int c) {
this->rows = r;
this->cols = c;
data_ = new int*[r];
for (int i = 0; i < r; i++) {
data_[i] = new int[c];
}
}
~Matrix() {
for (int i = 0; i < this->rows; i++) {
delete [] data_[i]; // Note A;
}
delete[] data_; // Note B; <-- not doing this line will leak memory, but why?
}
private:
int rows;
int cols;
int **data_;
};
解决方案
你发布的并不是一个真正的二维数组,它是一个一维指针数组(data_
),然后你为第一个数组的每个元素分配一个单独的整数数组(整数data_[0]
数组也是一个整数数组,依此类推)。c
data_[1]
c
鉴于此,很自然地,您必须delete[]
在析构函数中为new
之前在构造函数中执行的每个操作执行一次。
您的内存分配以及它们如何相互指向的图形图可能如下所示(如果c==6
并且您已将所有数组的整数设置为0
):
真正的 2D 数组分配看起来像这样: int * array2D = new int[6][8];
,但是如果数组维度是编译时常量,当然 C++ 只支持 2D 数组,所以这可能无法解决您的Matrix
类要解决的问题。
推荐阅读
- here-api - HERE Maps API 检索每个国家/地区的分层管理组
- google-sheets - 以近似匹配为条件的 GoogleSheet 值搜索
- java - 如何使用 Docx4J 向现有表中添加行
- amazon-web-services - 如何以编程方式获取 aws 短信发送报告?
- bash - 在 sed 中展开匹配的字符串
- python - 无法在 python 中使用 quiver 绘制风矢量
- r - r shiny selectInput - 仅在一列中可选择的类
- c++ - C++、Google、ServiceAccount、OAUTH2_JWT -> SHA256withRSA -> “error_description”:“无效的 JWT 签名。”
- c++11 - 在不同环境中缺少返回的相同非无效函数的不同结果
- python - Python函数中的阴影参数