C++ 删除地图<;int,list<;结构*>&燃气轮机;

C++ 删除地图<;int,list<;结构*>&燃气轮机;,c++,dictionary,pointers,memory,memory-management,C++,Dictionary,Pointers,Memory,Memory Management,伙计们,我在实现我的类的析构函数时遇到了问题,该类有一个mapsetCusto(_custo); 辅助->设置(encontrarFronteira(vertice_destino)); //Se o vertice nao existir 如果(aux->getVertice()->getVertice()==NULL){ cout setVertice(encontrarFronteira(vertice_origem)); myGrafo[vertice_destino]。推回(aux1)

伙计们,我在实现我的类的析构函数时遇到了问题,该类有一个
mapsetCusto(_custo);
辅助->设置(encontrarFronteira(vertice_destino));
//Se o vertice nao existir
如果(aux->getVertice()->getVertice()==NULL){
cout setVertice(encontrarFronteira(vertice_origem));
myGrafo[vertice_destino]。推回(aux1);

似乎您的结构的所有权有问题。您在列表中多次使用这些属性,并且多次删除它们是未定义的行为,因此只需删除一次

试着这样做:

for (auto it = myGrafo.begin(); it != myGrafo.end(); ++it) {
    for (auto it1 = (*it).second.begin(); it1 != (*it).second.end(); ++it1) {
        delete *it1;
    }
    (*it).second.clear();
}  
std::set<Arestas*> s;

for(const auto& p1: m)
{
    for(const auto& el: p1.second)
    {
        s.insert(el);
    }
}

似乎您的Arestas可能是唯一的,因此如果在那里共享并销毁
vertice
,问题可能在于Arestas析构函数。

首先,您只能
删除以前使用
new
语句创建的对象

如果是这样,为了避免多次调用delete,可以使用智能指针,如
std::shared\u ptr


您可以使用Valgrind执行代码,以获得此问题的更具体的跟踪信息。

需要更多数据。发生了一些不好的事情,但它可能发生在很久以前,并且程序实际上只是在析构函数期间才意识到。例如,导致双重删除的违规行为。问题:您有充分的理由存储这些数据吗
Arestas*
在列表中?删除指针应该会使销毁问题变得毫无意义。这是@AdamZahran我已经解决了这个问题,感谢你们大家!谢谢!@user4581301谢谢所有提示,从现在起我将更加关注三的规则!查看评论2。它还要求提供MCVE你删除了图像。请注意,没有一个答案真正直接回答了你的问题。他们大多建议你去看的地方,因为这个问题无法按照书面形式正确回答。我们没有对你投反对票,至少我希望人们不会投反对票。我们对这个问题投反对票。好(完整且原创)问题通常会被否决。边缘问题通常会被搁置,糟糕的问题会被否决。看起来这一个得到了一个否决票和两个接近票。这真的不算太糟糕。有些问题降到-10,在一分钟内被否决和删除,但这些问题通常都是骗局!问题或重复多次的问题每天都在想,为什么
++i+i++
不等于3?。你提供了足够好的指导性猜测,并得到了答案。这是一个胜利。你如何保证Arestas指针在该集中的唯一性?如果两个指针指向同一个对象,它们不相同,该集合仍会接受它们。是的,
vertice
就是s所有
Arestas*
中的ame,如[3100]和[3,50].这就是问题所在,我想知道我是否可以在删除地图后删除所有顶点。我不知道我是否可以清除我的自我。谢谢Matthieu,在查看我的代码后,问题出在Arestas析构函数上。在给出的示例中,列表之间没有共同点。Ok@LightnessRacesinOrbit我不知道该说什么,li怎么说你在stackoverflow中的第一个问题是什么?你有没有像你这样的人在评论中说你做了一个糟糕的问题?即使是很难回答的很多人都得到了正确的答案?嘿,谢谢你的帮助。我不确定我是否能用这个智能指针,因为我是在我的OOP课上做这个项目的。而且因为我从来没有在课堂上学过,所以我不是我不允许使用它。您是否也在使用new创建
vertice
?多个Free不太可能是问题,因为地图上的所有列表元素都是唯一的。可能包括一开始从不动态分配,但我们只是没有足够的信息来知道。@LightnessRacesinOrbit是的,很抱歉缺少信息信息,但由于是一个学校项目,我无法真正发布我的所有代码。但问题出在
Aresta
的析构函数中。谢谢!@diogofalken你需要有一些方法来了解你的对象何时拥有,何时不拥有。一种可能是在对象中有一个链接计数。当你删除链接时,减少链接计数。如果链接计数为零,则删除该对象。这可以通过使链接成为一个构造函数递增计数而析构函数递减计数的对象来实现。
for (auto it = myGrafo.begin(); it != myGrafo.end(); ++it) {
    for (auto it1 = (*it).second.begin(); it1 != (*it).second.end(); ++it1) {
        delete *it1;
    }
    (*it).second.clear();
}  
_CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}  
Arestas *aux = new Arestas();
        aux->setCusto(_custo);
        aux->setVertice(encontrarFronteira(vertice_destino));
        // Se o vertice nao existir
        if (aux->getVertice()->getVertice() == NULL) {
            cout << "ERROR" << endl;
            exit(1);
        }
        myGrafo[vertice_origem].push_back(aux);

        // Put the same path in the opposite vertice
        Arestas *aux1 = new Arestas();
        // set cost
        aux1->setCusto(_custo);
        // it looks for the vertice in the list<vertices*>
        aux1->setVertice(encontrarFronteira(vertice_origem));
        myGrafo[vertice_destino].push_back(aux1);
std::set<Arestas*> s;

for(const auto& p1: m)
{
    for(const auto& el: p1.second)
    {
        s.insert(el);
    }
}
for(auto p: s)
{
    delete p;
}