gpt4 book ai didi

c++ - 如何修复/正确初始化/清理矩阵类泄漏内存

转载 作者:太空狗 更新时间:2023-10-29 20:38:43 24 4
gpt4 key购买 nike

以下示例代码使用来自 SG2 package 的 SmallMatrix 类似乎会导致内存泄漏。在这个简化的例子中,只有很少的内存被泄露。但是我的复杂算法往往会耗尽内存。

#include "small_matrix.hpp"
int main() {
SmallMatrix<double> S(1);
}

请参阅下面的 Valgrind 输出。

8 bytes in 1 blocks are definitely lost in loss record 1 of 1
at 0x4C2B800: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x400D4A: SmallMatrix<double>::SmallMatrix(int) (small_matrix.hpp:1347)
by 0x400C15: main (test.cpp:3)

相关构造函数为源码引用部分:

template <class T>
SmallMatrix<T>::SmallMatrix(int the_m)
: small_matrix<T> (the_m, new T [the_m])
{
T * alloced_entries;
try
{
alloced_entries = new T [the_m];
}
catch(std::bad_alloc)
{
throw SMALL_MAT_NO_MEMORY;
};
small_matrix<T>::init (the_m, 1, alloced_entries);
}

Find a listing of small_matrix.hpp here.

第 1347 行内容如下:

: small_matrix<T> (the_m, new T [the_m])

析构函数可以在第 822 行找到:

~SmallMatrix () {delete [] SmallMatrix<T>::entry;};

这对我来说似乎很好。是吗?内存真的泄漏了吗?如何解决?我可能声明或初始化不正确吗?

最佳答案

你们都在使用初始化列表和显式初始化。

small_matrix 的构造函数使用您在初始化列表中创建的数组调用 init()。然后您手动调用 init() 来替换指向数组的指针。因此,您丢失了对在初始化列表中创建的数组的引用。

template <class T>
SmallMatrix<T>::SmallMatrix(int the_m)
: small_matrix<T> (the_m, NULL)
{
T * alloced_entries;
try
{
alloced_entries = new T [the_m];
}
catch(std::bad_alloc)
{
throw SMALL_MAT_NO_MEMORY;
};
small_matrix<T>::init (the_m, 1, alloced_entries);
}

应该修复内存泄漏

关于c++ - 如何修复/正确初始化/清理矩阵类泄漏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30654864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com