我正在使用类 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<MapPixel const*>::allocate(unsigned long, void const*) in ...
4: std::_Vector_base<MapPixel const*, std::allocator<MapPixel const*> >::_M_allocate(unsigned long) in stl_vector.h:131
5: std::vector<MapPixel const*, std::allocator<MapPixel const*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<MapPixel const**, std::vector<MapPixel const*, std::allocator<MapPixel const*> > >, MapPixel const* const&) in vector.tcc:271
6: std::vector<MapPixel const*, std::allocator<MapPixel const*> >::push_back(MapPixel const* const&) 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/