C ++应用程序中的内存泄漏

时间:2012-06-22 03:17:50

标签: c++ memory-management memory-leaks stdlist

我已经尝试了一千次在这个片段中找到该死的内存泄漏,但我只是悲惨地失败了...我正在学习内存分配和这些东西而且我是从来没有能够创建一个完全释放内存的程序......

我正在调用for循环来分配140个Contato_s结构并将它们放入Agenda std :: list中。然后我调用另一个for循环来删除使用RemoverContato和相应代码的所有140个联系人... Windows不报告单个Kb的free'd内存!

struct Contato_s
{
    int Codigo;
    std::string Nome, Numero, Email, Apelido;
};

std::list<Contato_s*> Agenda;

void CriarContato(std::string Nome, std::string Numero, std::string Email, std::string Apelido) // Add a contact to the list
{
    Contato_s *temp = new Contato_s; // Criando um contato temporario

    temp->Nome = Nome;
    temp->Numero = Numero;
    temp->Email = Email;
    temp->Apelido = Apelido;
    temp->Codigo = Agenda.size()+1;

    Agenda.push_back(temp); // Adicionando o contato a lista
}

int RemoverContato(int Codigo) // Delete a contact from the list
{
    for (std::list<Contato_s*>::iterator i = Agenda.begin(), e = Agenda.end(); i != e;)
    {
        if((*i)->Codigo == Codigo)
        {
            delete (*i);
            i = Agenda.erase(i);
            return 1;
        } else {
            ++i;
        }
    }
    return 0;
}

提前致谢:)!

- 编辑

好的,这就是我试图摧毁联系人的方式:

for(int i=0; i<140; ++i)
    {
        if(RemoverContato(1+i) == 0)
            std::cout << "Fail removing contact " << i << std::endl;
        else
            std::cout << "Contact " << i << " removed" << std::endl;
    }

(Ofc我总是得到“联系X被删除”并且没有在该部分失败,所以理论上找到了联系人)

1 个答案:

答案 0 :(得分:0)

您需要确保每个Contato_s都有一个唯一的Codigo(这是否意味着ID?我将其称为ID)。可能有多个Contato_s可以共享相同的ID,因为您将ID基于Agenda的当前大小(假设您添加了两个联系人,删除了第一个联系人,然后添加了另一个...这两个联系人的ID都是2。您的删除技术将仅删除第一个匹配的ID,让其他ID保留。在RemoverContato返回成功或失败之前,您应该检查所有联系人并检查所有ID。