【发布时间】:2012-11-27 13:33:15
【问题描述】:
阅读后: C++ Array of pointers: delete or delete []? (由 shai vashid 回复) 和 http://www.cplusplus.com/forum/beginner/6651/
我实现了以下:
内核.h
unsigned int **ConfigMeM;
//.....
~Kernel(){ //destructor
for (unsigned int i=0; i<MeMSize; i++)
delete [] MeM[i]; //Valgrind:- Invalid read of size 4
- Invalid free() / delete / delete[] / realloc()
delete [] MeM; //Valgrind: Invalid free() / delete / delete[] / realloc()
for (unsigned int i=0; i<_item_tot; i++)
delete [] ConfigMeM[i]; //Valgrind: Same comments as above
delete [] ConfigMeM; //Valgrind: same as above
};
内核.cpp
//.......
MeM = new unsigned int*[MeMSize];
for (unsigned int i=0; i<MeMSize; i++){
MeM[i] = new unsigned int[11]; //Valgrind: 14,608 bytes in 332 blocks are definitely lost in loss record 2,021 of 2,036
}
for (unsigned int i=0; i<MeMSize; i++){
for (int j=0; j<10; j++){
MeM[i][j] = 0;
}
}
//.....
ConfigMeM = new unsigned int*[_item_tot];
for (unsigned int i=0; i<_item_tot; i++){
ConfigMeM[i] = new unsigned int[3]; //Valgrind: 1,200 bytes in 100 blocks are definitely lost in loss record 1,131 of 2,036
}
for (unsigned int i=0; i<_item_tot; i++){
for (int j=0; j<3; j++){
ConfigMeM[i][j] = 0;
}
}
//.....
我不确定自己做错了什么。
有什么建议吗?
谢谢。
【问题讨论】:
-
你是否多次运行Kernel.cpp中的代码?
-
Kernel.cpp 中的代码是构造函数的一部分,还是其他?您是否声明了自己的复制构造函数和复制赋值运算符(根据Rule of Three)?我的猜测是你不是,你最终会得到两个试图删除相同内存的对象。
-
@KerrekSB 是的,你是对的!在顶层模块中创建了几个内核副本。例如,在当前示例中为 64。这有什么关系?!
-
“这有什么关系?”想一想:
int * p = new int; p = new int; p = new int; delete p; -
@KerrekSB 我不是故意要挑战你的!!我现在只想问我可以做什么以及如何修改我的代码?
标签: c++ valgrind double-pointer