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

标签 c++ memory-leaks

以下示例代码使用来自 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/

相关文章:

c++ - 设置 packaged_task 的正确方法

c++ - 坏指针 : expression can not be evaluated while parsing tokens

c++ - 内存泄漏分析

java - MediaControllerCompat 内存泄漏

c++ - Visual Studio 中的 stb_image.h - 未解析的外部符号

c++ - 是否可以一步在堆上创建一个 lambda?

c++ - 使用 QT 从 MySQL 返回 SUM 值时出错

您可以使用 gdb(或其他工具)从核心文件中找到内存泄漏吗?

asp.net - 遍历 !DumpHeap 输出以读取内存偏移量处的值

c - OpenSSL ASN1_item_ex_d2i 内存泄漏