内存泄漏在哪里
Where are the memory leaks?
我有这段代码,由于某种原因,它产生了 6 个内存泄漏,我不知道在哪里。
Lemon::Lemon()
{
this->nrOf=0;
int x=10;
this->matrix=new int*[x];
this->lines=new string[x];
for (int i = 0; i < x; ++i)
this->matrix[i] = new int[x];
for(int i=0;i<x;++i)
for(int j=0;j<x;++j)
this->matrix[i][j]=-1;
}
Lemon::Lemon(int n)
{
this->x=this->nrOf;
this->matrix=new int*[x];
this->lines=new string[x];
for (int i = 0; i < x; ++i)
this->matrix[i] = new int[x];
for(int i=0;i<x;++i)
for(int j=0;j<x;++j)
this->matrix[i][j]=-1;
}
Lemon::~Lemon()
{
for(int i=0;i<this->nrOf;i++)
{
delete []this->matrix[i];
}
delete []this->matrix;
delete []this->lines;
}
感谢任何形式的帮助。
此时:
this->x=this->nrOf;
nrOf 尚未初始化 - 您有未定义的行为。
也许你会从使用std::vector中受益。
默认构造函数使用 0 初始化 nrOf,但您分配的矩阵为 10x10。这意味着析构函数不会运行 for 循环,因为 nrOf 为 0。
顺便说一句,您不必用这个前缀来前缀所有内容。它有点使代码更难阅读。您应该仅将其用于消除歧义。
您不会nrOf
设置为任一构造函数中分配的矩阵行数。
尝试将其作为您唯一的构造函数
Lemon::Lemon(int n = 10) // default constructor
{
nrOf = n;
matrix = new int*[nrOf];
lines = new string[nrOf];
for (int i = 0; i < nrOf; ++i)
matrix[i] = new int[nrOf];
for(int i=0; i<nrOf; ++i)
for(int j=0; j<nrOf; ++j)
this->matrix[i][j] = -1;
}
您似乎既有一个成员变量int x
(在Lemon::Lemon(int n)
中使用),又有一个局部变量int x
Lemon::Lemon()
。 此外,您不会在构造函数中始终如一地设置nrOf
。
注1:
代码中的每个新表达式都可能是内存泄漏,因为您的代码非常异常不安全:如果任何new
表达式抛出异常,则所有已新分配的存储都会泄漏。
注2:
您的第一个构造函数在语义上与您的析构函数不匹配(即使我们假设在不抛出的情况下一切正常):构造函数为this->nrOf
分配零值,但分配this->matrix
数组的 10 个元素并将分配的数组分配给每个元素 BUT 析构函数期望删除this->matrix
(数组)的this->nrOf
元素,因此删除 0 个元素,从而泄漏 10 个元素。
旁注:您的this->x
(根据第二个构造函数存在)不是由第一个构造函数初始化的。
注3:
你的第二个构造函数只是损坏了:你从不初始化this->nrOf
变量,但你使用它就像它包含有效的东西一样。
加:
这里的好建议是:永远不要使用数组和new
/new[]
/delete
/delete[]
表达式。请改用std::vector
在您的情况中。这样,您可能永远不会关心内存泄漏,异常安全等。
您的matrix
如下所示:
std::vector< std::vector<int> > matrix;
....................
....................
n = 10;
m = 20;
matrix.resize(n);
for( size_t j = 0; j < n; ++j )
{
matrix[j].resize(m);
for( size_t k = 0; k < m; ++k )
{
matrix[j][k] = j+k;
}
}
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何通过Valgrind找到QThreads程序中的内存泄漏在哪里?
- Adobe 字符串内存泄漏 - 在哪里调用外部库入口点以释放内存?
- 瓦尔格林德:我的记忆泄漏在哪里
- 我不知道我在哪里泄漏了内存C++
- 我的记忆泄漏在哪里
- 瓦尔格林德报告内存泄漏,但我不明白它发生在哪里
- 内存泄漏在哪里?2d数组类
- 内存泄漏在哪里
- C++内存泄漏 - 我删除什么,在哪里删除