Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将\u倒推到指针列表中会导致内存泄漏_C++_Visual Studio_List_Memory Leaks - Fatal编程技术网

C++ 将\u倒推到指针列表中会导致内存泄漏

C++ 将\u倒推到指针列表中会导致内存泄漏,c++,visual-studio,list,memory-leaks,C++,Visual Studio,List,Memory Leaks,我正在尝试使用可视泄漏检测器查找内存泄漏。 它向我显示m_邻居。推回(ent)导致泄漏 (简短的callstack=neightarcalculatordummy->foreach->list->allocate) 我使用它作为邻域计算器dummy,所以pushback应该只在列表中插入指针,而不进行任何分配。 通过加法得到的所有指向实体的指针都会在代码的其他地方被删除 推回怎么可能导致泄漏 template <typename entity_type> class Neighbor

我正在尝试使用可视泄漏检测器查找内存泄漏。 它向我显示
m_邻居。推回(ent)导致泄漏

(简短的callstack=neightarcalculatordummy->foreach->list->allocate)

我使用它作为
邻域计算器dummy
,所以pushback应该只在列表中插入指针,而不进行任何分配。 通过加法得到的所有指向实体的指针都会在代码的其他地方被删除

推回
怎么可能导致泄漏

template <typename entity_type>
class NeighborCalculatorDummy
{
public:
    inline void addEntity(const entity_type & entity)
    {
        m_entities.push_back(entity);
    }

    void calculateNeighbors(const vector_type & position, flt32 radius)
    {
        flt32 rSq = radius*radius;
        m_neighbors.clear();

        std::for_each(m_entities.begin(), m_entities.end(), [&](entity_type ent){
            if(lengthSq(ent->getPosition() - position) <= rSq)
                m_neighbors.push_back(ent);
        });
    }

private:
    std::vector<entity_type> m_entities;
    std::list<entity_type> m_neighbors;
};
模板
类邻域计算器虚拟
{
公众:
内联无效加法(常量实体类型和实体)
{
m_实体。推回(实体);
}
空隙计算器导杆(常数向量的类型和位置,flt32半径)
{
flt32 rSq=半径*半径;
m_邻居。清除();
std::for_each(m_entities.begin()、m_entities.end()、[&](entity_type ent){
if(长度SQ(ent->getPosition()-位置)加法(车辆);
});
//#3加法的实现
模板
void neightarcalculatordummy::addEntity(常量实体类型和实体)
{
...
m_entities.push_back(entity);//m_entities is-std::vector
}
//#4节目结束
删除相邻计算器;
标准::对于每个(车辆.开始(),车辆.结束(),[&](车辆*车辆){
删除车辆;
});

在我看来,
实体类型
是一个指针(从每个lambda的for_判断)

你可能想用

 NeighborCalculatorDummy<SomeEntity>
邻域计算器虚拟
而不是

 NeighborCalculatorDummy<SomeEntity*>
邻域计算器虚拟
在代码的其他位置(未显示)

当然,lambda的拼写会有所不同:

[&](const entity_type& ent){
        if(lengthSq(ent.getPosition() - position) <= rSq)
            m_neighbors.push_back(ent);
    }
[&](常量实体类型和输入){

如果(lengthSq(ent.getPosition()-position)使用此定义,则根据实体类型,代码是否泄漏

  • 如果实体类型是指针,默认析构函数将只调用vector的析构函数。这将释放为这些指针分配的内存,但不会对它们调用delete。如果此类“拥有”如果要释放向量中的项,则需要添加一个析构函数,该析构函数为向量中的所有项调用delete。在这种情况下,您可能会考虑模板参数,因为它不清楚此处是否需要指针
  • 如果实体类型是值类型,则默认析构函数就足够了,因为放置到向量中的副本将被向量的析构函数删除

我在实体的父级中省略了虚拟析构函数。这就是推送虚拟析构函数导致泄漏的原因。

您在哪里删除动态分配内存的指针?您在哪里分配的?您可能需要添加更多信息,例如
实体的类型是什么,以及
邻接虚拟计算器如何使用ed(它正在被销毁吗?)如果泄漏的内存是在
push_back
调用中获取的,这似乎表明列表没有被正确销毁。CRT内存泄漏检测器是否显示相同的泄漏?添加\u crtsetdbglag(\u CRTDBG_REPORT_FLAG)|u CRTDBG_leak_CHECK_DF)到程序的开头。程序关闭时是否报告内存泄漏?@Als请参阅我的问题的编辑,我将其放在那里,虽然用户可能需要不同的版本,但这并不能解释内存泄漏。未被释放的不是
SomeEntity
对象,而是列表节点(这是从
分配器
内部
push_back
中获取的)我不想像
neightarcaldummy
那样使用它,因为它会在
neightarcaldummy
中创建其他实体的列表。我只想使用这个类的指针(因为stl不允许创建vecotr/引用列表)
[&](const entity_type& ent){
        if(lengthSq(ent.getPosition() - position) <= rSq)
            m_neighbors.push_back(ent);
    }