0

私はすでにこのスニペットでメモリ リークを見つけようと何千回も試みましたが、惨めなほど失敗しています...メモリ割り当てとこれらのことを学んでいますが、完全に解放されるプログラムを作成することはできませんでしたまだ思い出です…

for ループを呼び出して、140 個の Contato_s 構造体を割り当て、それらを Agenda std::list に入れています。次に、別の for ループを呼び出して、RemoverContato とそれぞれのコードを使用して 140 の連絡先すべてを削除します... Windows は、解放されたメモリの 1 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;
    }

(私は常に「連絡先Xが削除されました」と表示され、その部分で失敗しないため、理論的には連絡先が見つかっています)

4

1 に答える 1

0

Contato_sそれぞれが一意であることを確認する必要がありますCodigo(これはIDを意味しますか?私はそれをIDと呼びます)。Contato_s現在のサイズに基づいてIDを作成するため、複数の連絡先が同じIDを共有できる可能性がありAgendaます(たとえば、2つの連絡先を追加し、最初の連絡先を削除してから、別の連絡先を追加しました...これらの連絡先は両方とも同じIDを持ちます2)。削除手法では、最初に一致したIDのみが削除され、他のIDは残ります。で成功または失敗を返す前に、すべての連絡先を調べてすべてのIDを確認する必要がありRemoverContatoます。

于 2012-06-22T03:27:41.033 に答える