C++内存泄漏新建并删除
C++ memory leak new and delete
我很难找到这个内存泄漏。
我相信这与盆地
有关int numbasinsx(int size, double *f)
{
int maxBasin, maxRelabel, bcnt;
unsigned int newgene;
int *basin, *relabel;
int relabelcnt;
//
// find the basins
//
maxBasin = 1<<size;
basin = new int [maxBasin];
for (int gene=0; gene<maxBasin; gene++) basin[gene] = 0;
bool change = true;
bcnt = 0;
while (change) {
change = false;
for (int gene=0; gene<maxBasin; gene++) {
bool dominated = false;
for (int i=0; i<size; i++) { // for all neighbors
newgene = gene ^ (1<<i); // newgene is a neighbor 1 bit away
if (f[newgene] > f[gene]) dominated = true; // if neighbor is better mark it
if (basin[newgene]!=0) { // something to copy
if (f[newgene] > f[gene]) { // gene is dominated
if (basin[gene]==0 || basin[gene]<basin[newgene]) { // if not labeled or not lowest number
basin[gene] = basin[newgene]; // then label or relabel
change = true;
}
}
else if (f[newgene] == f[gene]) {
if (basin[gene]<basin[newgene]) {
basin[gene] = basin[newgene];
change = true;
}
}
}
}
if (! dominated && basin[gene]==0) {
// printf("max: %d %lgn", gene, f[gene]);
basin[gene] = ++bcnt;
change = true;
}
}
}
//
// relabel the basins
//
maxRelabel = maxBasin/2+1;
relabel = new int [maxRelabel];
for (int gene=0; gene<maxRelabel; gene++) relabel[gene] = 0;
relabelcnt = 1;
for (int gene=0; gene<maxBasin; gene++) {
if (basin[gene]>=maxRelabel) printf("ERROR: trying to index %d into relabel array with max index of %dn", basin[gene], maxRelabel-1);
if (relabel[basin[gene]]==0) {
relabel[basin[gene]] = relabelcnt++;
}
// printf("%d %lg %dn", gene, f[gene], relabel[basin[gene]]);
}
// printf("%dn", relabelcnt-1);
delete basin;
delete relabel;
return relabelcnt-1;
}
我将保留上述内容以帮助其他人,但是带有向量的新代码现在已 http://codepad.org/KiV85Brw。矢量运行时间比 delete[] 版本慢得多,对于大型输入,它甚至会出现段错误。我做错了什么
如果你使用
operator new[]
来分配一堆字节,那么你必须使用 operator delete[]
来销毁它们:
basin = new int [maxBasin];
//.....
delete[] basin;
请注意,您正在对 relabel
执行相同的操作。
无论如何,对于此类任务,您应该使用std::vector
:
std::vector<int> basin(maxBasin), relabel(maxRelabel); // We haz no leaks
new[]
后面必须跟delete[]
,而不仅仅是delete
。 您用于释放数组basin
和relabel
的代码都是错误的。
basin
和 relable
都是数组。 使用 new
运算符在堆上分配数组时,删除数组的语法与删除单个变量的语法不同。 正确的语法是:
delete[] basin;
delete[] relable;
我相信您编写的代码只会删除每个数组的第一个元素。
由于您正在分配数组,请使用 delete [] basin;
.delete
运算符适用于单个对象;delete []
适用于多个对象(数组)。
basin = new int [maxBasin];
对于数组,您应该使用运算符 delete[]。还要检查relabel
。
看起来它是一个小的局部变量,您确定要使用动态分配吗?为什么?如果你必须比尝试unique_ptr。
相关文章:
- 创建模板类型而不新建/删除
- C++ 在请求特定字节的新建后删除
- 为什么非放置"新建"和"删除"内置于语言中,而不仅仅是常规函数?
- 来自C#的mingw DLL:为什么我必须覆盖新建/删除?
- C++ - 定义自定义新建和删除运算符时make_shared
- 使用安全零内存新建/删除时出现问题
- 奇怪的内存泄漏由C++中的新建/删除
- CRT 检测到应用程序在堆缓冲区(新建/删除)类结束后写入内存
- 无法覆盖C++中纯抽象类中的运算符删除/新建
- 编译器或标准C++库 - 新建和删除
- 混合运算符和表达式新建/删除
- 新建和删除的经验法则
- 运算符新建和删除重载作用域
- 使用运算符重载(新建/删除)实现单例的优缺点
- 忽略全局覆盖的新建/删除
- C++内存泄漏新建并删除
- 基本的新建/删除操作员日志记录
- C++自定义全局新建/删除覆盖系统库
- 为什么使用XXXX_new和XXXX_free而不是新建和删除
- 新建和删除如何工作以及它们的存储位置