C++ 我的程序内存泄漏;析构函数没有被调用吗?

C++ 我的程序内存泄漏;析构函数没有被调用吗?,c++,memory-leaks,valgrind,destructor,C++,Memory Leaks,Valgrind,Destructor,我觉得我的头撞到了砖墙上 我不确定析构函数是否真的被调用了。我使用一个优先级队列来保存一组节点。每个节点都有一个成员m_grid,即结构的二维数组。这个网格表示我在程序中显式使用的唯一指针 由于某种原因,我得到了很多泄漏。你能帮我吗 这是析构函数: grid::~grid() { for (int i = 0; i < m_width; i++) { delete[] m_grid[i]; m_grid[i] = NULL; } delete[] m_gr

我觉得我的头撞到了砖墙上

我不确定析构函数是否真的被调用了。我使用一个优先级队列来保存一组节点。每个节点都有一个成员m_grid,即结构的二维数组。这个网格表示我在程序中显式使用的唯一指针

由于某种原因,我得到了很多泄漏。你能帮我吗

这是析构函数:

grid::~grid()
{
  for (int i = 0; i < m_width; i++)
  {
    delete[] m_grid[i];
    m_grid[i] = NULL;
  }

  delete[] m_grid;
  m_grid = NULL;
}
grid::~grid()
{
对于(int i=0;i
赋值运算符:

grid& grid::operator=(const grid& g)
{
  m_x_rad = g.m_x_rad;
  m_y_rad = g.m_y_rad;
  m_width = g.m_width;
  m_height = g.m_height;
  m_orientation = g.m_orientation;

  if (m_width != 0)
    m_grid = new cell* [m_width];

  // from left to right
  for (int i = 0; i < m_width; i++)
  {
    m_grid[i] = new cell [m_height];

    // from top to bottom
    for (int j = 0; j < m_height; j++)
    {
      m_grid[i][j].m_occupied = g.m_grid[i][j].m_occupied;
      m_grid[i][j].m_rad = g.m_grid[i][j].m_rad;
    }
  }

  return *this;
}
grid&grid::operator=(常量grid&g)
{
m_x_rad=g.m_x_rad;
m_y_rad=g.m_y_rad;
m_宽度=g.m_宽度;
m_高度=g.m_高度;
m_方向=g.m_方向;
如果(m_宽度!=0)
m_网格=新单元*[m_宽度];
//从左到右
对于(int i=0;i
赋值运算符与预期类似。 最后,这里是一些valgrind输出(有很多,但都与grid::setSize()或grid::operator=有关)

==13329== 200 (40 direct, 160 indirect) bytes in 1 blocks are definitely lost in loss record 25 of 166
==13329==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13329==    by 0x4020C1: grid::operator=(grid const&) (grid.cpp:192)
==13329==    by 0x40A02E: node::operator=(node const&) (node.cpp:129)
==13329==    by 0x4075A6: __push_heap<__gnu_cxx::__normal_iterator<node*, std::vector<node> >, long int, node, __gnu_cxx::__ops::_Iter_comp_val<std::greater<node> > > (stl_heap.h:135)
==13329==    by 0x4075A6: push_heap<__gnu_cxx::__normal_iterator<node*, std::vector<node> >, std::greater<node> > (stl_heap.h:199)
==13329==    by 0x4075A6: push (stl_queue.h:502)
==13329==    by 0x4075A6: aStarGraphSearch(basic_map const&, node&, std::unordered_map<int, basic_node, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<int const, basic_node> > >&, std::priority_queue<node, std::vector<node, std::allocator<node> >, std::greater<node> >&) (main_functions.cpp:216)
==13329==    by 0x4088ED: search(int) (main_functions.cpp:706)
==13329==    by 0x401AAA: main (main.cpp:13)
==13329==1个块中的200(40个直接字节,160个间接字节)字节肯定会在166的丢失记录25中丢失
==13329==at 0x4C2E80F:operator new[](无符号长)(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==13329==by 0x4020C1:grid::operator=(grid const&)(grid.cpp:192)
==13329==by 0x40A02E:node::operator=(node const&)(node.cpp:129)
==13329==按0x4075A6:uuu推_u堆(stl_堆.h:135)
==13329==by 0x4075A6:push_heap(stl_heap.h:199)
==13329==by 0x4075A6:push(stl_queue.h:502)
==13329==by 0x4075A6:aStarGraphSearch(基本映射常量&,节点&,标准::无序映射&,标准::优先级&)(主函数.cpp:216)
==13329==by0x4088ed:search(int)(main_functions.cpp:706)
==13329==0x401AAA:main(main.cpp:13)

我在这里真的很挣扎。当我使用堆栈而不是优先级队列时,我没有这些问题。非常感谢您的帮助。

您不会删除
m\u grid
(及其包含的阵列)在赋值运算符中。

对赋值运算符的调用不会首先自动调用析构函数。如果要用新内存替换对象,则必须清除对象本身已拥有的任何内存


赋值不会生成新对象;它只是修改您已经得到的对象。

没有权威性的答案是可能的,但很明显复制构造函数无法销毁现有的动态分配的类成员,因此内存泄漏。
操作符=
在分配内存时没有删除旧的me莫瑞。这是故意的吗?如果允许,请使用
std::vector
而不是
cell**
来捕获网格。@GregKikola我不知道我理解了你的意思。在处理优先级队列时,我创建了一个与顶部节点相等的新节点。这将调用
操作符=
,但我需要保留原始和原始节点副本。@RSahu:甚至不是这样;使用
std::vector
和覆盖二维索引的封装类型。如果我删除
m_grid
,我以后将无法访问网格…对吗?@hockeysain是的。但是如果你不删除它,你会有内存泄漏。哦,我误解了。如果我错了,请纠正我,但现在我错了我想你的意思是我应该删除新创建的
m\u网格
。当然可以,但是类似于
节点top\u节点=frontier.top();
(frontier是我的队列)的东西应该使
top\u节点
成为
frontier.top()
的精确副本,据我所知。@hockeysain:这不调用赋值运算符。这是初始化,不是赋值。