为什么析构函数不释放数组内存?
Why destructor doesn't free array memory?
我的问题是为什么析构函数不释放我的临时数组的内存?Valgrind 告诉我,我在构造函数中使用了 new 运算符,但之后没有删除内存。当我简单地写delete temp
时,我在瓦尔格林德中遇到了许多错误,例如大小读取无效、双重释放等。你能告诉我这是怎么回事吗?
array_xyz(const int r, const int c, double **arg_array) {
rows = r;
cols = c;
array_xyz *temp = new array_xyz();
temp->arr = new double *[rows];
temp->rows = r;
temp->cols = c;
arr = new double *[rows];
for (int i = 0; i < rows; i++) {
arr[i] = new double [cols];
temp->arr[i] = new double [cols];
}
for (int j = 0; j < rows; j++) {
for (int k = 0; k < cols; k++)
temp->arr[j][k] = arg_array[j][k];
}
arr = temp->arr;
//delete temp; -> doesn't work, valgrind tells that I free memory twice
}
array_xyz() {
rows = 0;
cols = 0;
arr = NULL;
}
~array_xyz() {
for (int i = 0; i < rows; i++)
delete []arr[i];
delete []arr;
}
您可以同时分配arr
(及其所有行)和temp_arr
(及其所有行)。 然后你做arr=temp_arr;
. 它不会将 temp_arr
的值复制到 arr
。相反,它强制arr
指向与temp_arr
相同的地址。 以前分配给arr
的整个内存现在是孤立的(没有指向它的指针,因此您无法释放它,并且它没有任何可用用途)。 如果你删除temp_arr
,它会自动删除arr
,因为它们现在指向内存中的同一位置。
在此语句之后
arr = temp->arr;
指针arr
和temp->arr
都指向相同的内存扩展。
如果添加此声明
delete temp
然后,类 array_xyz
的析构函数释放此内存范围(以及动态分配数组的元素指向的范围)。此外,所创建对象的析构函数也将删除相同的内存范围,因为它自己的指针arr
指向相同的内存。因此,将尝试两次释放相同的内存扩展数据块。
不清楚为什么使用指针 temp
指向的中间动态创建对象。它完全是一个冗余代码,只会使构造函数的读者感到困惑。
谢谢你,我明白了。我想将值从 arg_array 复制到 arr,好在那里甚至不需要温度。
这是解决方案:
array_xyz(const int r, const int c, double **arg_array) {
rows = r;
cols = c;
arr = new double *[rows];
for (int i = 0; i < rows; i++) {
arr[i] = new double [cols];
}
for (int j = 0; j < rows; j++) {
for (int k = 0; k < cols; k++)
arr[j][k] = arg_array[j][k];
}
}
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 使用无符号字符数组有效存储内存
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 为什么调用堆栈数组会导致内存泄漏
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 查找自动生成键并具有线性内存消耗的小型关联数组
- C++,为什么数组比矢量更快,使用更少的内存
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 动态分配字符数组的内存
- 将内存分配返回值强制转换为 TYPE 数组
- 销毁C++中动态分配的内存(数组对象)
- 给定特定内存地址的数组的动态内存分配
- 如何通过 malloc 为队列数组分配内存?
- 如何使用内存集清除字符数组
- 如何初始化所有元素为 0 的指针的二维动态内存数组
- 共享内存数组是否由 CreateFileMapping/MapViewOfFile 零初始化
- C++ 分配 struc 的内存数组
- 在CUDA中有效初始化共享内存数组