c++ - 点网格上的内存泄漏(Valgrind)

标签 c++ memory-leaks valgrind

我正在使用类 mapPixel 的概念创建 map 网格(2D 离散点数):

class MapPixel
{
    friend class Map;
protected:
    int x;
    int y;
    float height;
    float vegetation;

    std::vector<const MapPixel*> neib;
...methods declaration, default constructor/destructor

其中 neib 是指向与 then 相邻的其他 MapPixel 的指针列表。

我正在使用的方法

void MapPixel::addNeib(const MapPixel* neib_)
{
    neib.push_back(neib_);
}

添加指向相邻像素的指针以构建图形(由于边界的相邻像素少于中心像素,因此此列表取决于大小)。

我的程序是有一个带有成员的类 Map

MapPixel **pixels;

在构造函数 Map::Map() 中使用

pixels = new MapPixel*[width];
for (int i = 0; i < width; i++)
    pixels[i] = new MapPixel[height];

我使用方法 MapPixel::addNode() 构建网络(例如)

pixels[i][j].addNeib(&pixels[i][j+1]);

在 Map::~Map() 中,我按相反的顺序删除 MapPixel(不删除 neibs 以避免双重释放):

for (int i = 0; i < width; i++)
    delete pixels[i];
delete pixels;

Valgrind 说有几个像这样的大内存泄漏:

2,509,088 bytes in 39,205 blocks are possibly lost in loss record 4,071 of 4,071
  in MapPixel::addNeib(MapPixel const*) in Source/mappixel.cpp:52
  1: malloc in vg_replace_malloc.c:266
  2: operator new(unsigned long) in /usr/lib/libstdc++.6.0.9.dylib
  3: __gnu_cxx::new_allocator&lt;MapPixel const*&gt;::allocate(unsigned long, void const*) in ...
  4: std::_Vector_base&lt;MapPixel const*, std::allocator&lt;MapPixel const*&gt; &gt;::_M_allocate(unsigned long) in stl_vector.h:131
  5: std::vector&lt;MapPixel const*, std::allocator&lt;MapPixel const*&gt; &gt;::_M_insert_aux(__gnu_cxx::__normal_iterator&lt;MapPixel const**, std::vector&lt;MapPixel const*, std::allocator&lt;MapPixel const*&gt; &gt; &gt;, MapPixel const* const&amp;) in vector.tcc:271
  6: std::vector&lt;MapPixel const*, std::allocator&lt;MapPixel const*&gt; &gt;::push_back(MapPixel const* const&amp;) in stl_vector.h:608
  7: MapPixel::addNeib(MapPixel const*) in mappixel.cpp:52

所有与第 52 行相关的内容:

neib.push_back(neib_);

有人看懂了吗?现在我对是否可以使用 std::vector 来构建我的像素的 neibs 失去了信心。

最佳答案

请注意,valgrind 说的是“可能 丢失”,而不是“肯定 丢失”。区别很重要。参见 here的确切含义。

该错误与 vector<> 分配的 block 有关实现代码,最有可能将包含元素的内存块调整为 vector成长。如果您正在分配 MapPixel 的实例,您可能会得到这些并忘记释放它们,因为包含 vector然后将无法释放它的内存,但是你也会得到关于你自己的代码的错误。

除非!当你释放 pixels数组,你在使用 delete[]delete

更新:您正在使用 delete .您需要使用 delete[] .这确实是内存泄漏。你用 new[] 分配的任何东西必须用 delete[] 释放,否则只会为第一个元素调用适当的析构函数(即使是编译器自动生成的析构函数)。

关于c++ - 点网格上的内存泄漏(Valgrind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10469069/

相关文章:

c++ - 在 C/C++ 项目中查找 "undefined"引用

c++ - 如果类具有基于模板参数的成员,我可以自定义吗?

c - 有没有办法验证我的程序没有内存泄漏?

objective-c - 什么是 CG 光栅数据?

jquery - jQuery .html() 方法会泄漏内存吗?

segmentation-fault - 使用 Open MPI 运行并行程序时发生段错误

c++ - 有没有C++/win32库函数把文件路径转换成文件://URL?

C++ select 停止接受连接

c - 使用 fscanf 时调试 seg 错误时出现问题

android - Valgrind 无法创建临时文件