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);
}