C++ 静态std::list中存储的指针的Valgrind错误内存泄漏

C++ 静态std::list中存储的指针的Valgrind错误内存泄漏,c++,valgrind,C++,Valgrind,Valgrind显示了存储在静态std::list变量中的指针的内存泄漏。下面是示例代码 显示“自动t=新Abc;”泄漏(绝对丢失:1个块中有4个字节) 这是Valgrind的一只虫子吗 是否有解决方案/解决方法(手动清除池::队列除外) std::listdestructs(编译器负责静态对象的解构),其中的对象不会被解构,因为这是~Pool的作业,代码不会在任何地方调用~Pool。Abc实例仍然存在并且确实无法访问,泄漏报告是正确的。由@dratenik提供的答案是正确的,我将根据他的答案发

Valgrind显示了存储在静态std::list变量中的指针的内存泄漏。下面是示例代码

显示“自动t=新Abc;”泄漏(绝对丢失:1个块中有4个字节)

这是Valgrind的一只虫子吗

是否有解决方案/解决方法(手动清除池::队列除外)


std::list
destructs(编译器负责静态对象的解构),其中的对象不会被解构,因为这是~Pool的作业,代码不会在任何地方调用~Pool。
Abc
实例仍然存在并且确实无法访问,泄漏报告是正确的。

由@dratenik提供的答案是正确的,我将根据他的答案发布修改后的代码,以便其他开发人员可能会发现它有用

#include <list>

struct Abc
{
        int y = 9;
};


struct List
{
   std::list<Abc*> queue;

   void push_back(Abc* p)
   {
        queue.push_back(p);
   }

    ~List()
    {
           for (auto& p : queue)
          {
              delete p;
          }
     }


};

struct Pool
{
        static List queue;

};

List Pool::queue;

int main ()
{

  auto t = new Abc;
  Pool::queue.push_back(t);

  return 0;
}
#包括
结构Abc
{
int y=9;
};
结构列表
{
std::列表队列;
无效推回(Abc*p)
{
队列。推回(p);
}
~List()
{
用于(自动&p:队列)
{
删除p;
}
}
};
结构池
{
静态列表队列;
};
列表池::队列;
int main()
{
自动t=新Abc;
池::队列。推回(t);
返回0;
}

未构造
池的对象,则不会调用
池的析构函数。不,这不是错误。你的程序内存泄漏。删除内存。我认为是(auto p:queue)
创建了队列元素的副本,然后将其删除。请尝试
(自动&p:queue)
。如果您不
删除
您的
新内容
,则它是泄漏。对象的生命期应该是程序的剩余运行时,这一点并不重要。std::list自毁(编译器负责静态对象的自毁),其中的对象不自毁,因为这是~Pool的作业,您不调用它。无法访问Abc实例,泄漏报告是正确的。我将接受更正!即使有了解释,我还是花了一分钟的时间才完全理解。这再次表明,使用valgrind等工具分析代码是多么重要。他们可以看到你作为一个人所不能看到的问题。
==8807== Memcheck, a memory error detector
==8807== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==8807== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==8807== Command: ./a.out
==8807== 
==8807== 
==8807== HEAP SUMMARY:
==8807==     in use at exit: 4 bytes in 1 blocks
==8807==   total heap usage: 3 allocs, 2 frees, 72,732 bytes allocated
==8807== 
==8807== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==8807==    at 0x4C2A1E3: operator new(unsigned long) (vg_replace_malloc.c:334)
==8807==    by 0x4007D9: main (Main.cpp:26)
==8807== 
==8807== LEAK SUMMARY:
==8807==    definitely lost: 4 bytes in 1 blocks
==8807==    indirectly lost: 0 bytes in 0 blocks
==8807==      possibly lost: 0 bytes in 0 blocks
==8807==    still reachable: 0 bytes in 0 blocks
==8807==         suppressed: 0 bytes in 0 blocks
==8807== 
==8807== For counts of detected and suppressed errors, rerun with: -v
==8807== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
#include <list>

struct Abc
{
        int y = 9;
};


struct List
{
   std::list<Abc*> queue;

   void push_back(Abc* p)
   {
        queue.push_back(p);
   }

    ~List()
    {
           for (auto& p : queue)
          {
              delete p;
          }
     }


};

struct Pool
{
        static List queue;

};

List Pool::queue;

int main ()
{

  auto t = new Abc;
  Pool::queue.push_back(t);

  return 0;
}