0

我已经尝试了一千次来在这个片段中找到该死的内存泄漏,但我只是悲惨地失败了......我正在学习内存分配和这些东西,我永远无法制作一个完全免费的程序它的记忆还...

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

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 被删除”并且在那部分没有失败,所以理论上可以找到联系人)

4

1 回答 1

0

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

于 2012-06-22T03:27:41.033 回答