gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:04:51 24 4
gpt4 key购买 nike

我正在使用类 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/

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