zweidimensionales - Was passiert, wenn ich ein Array einmal in C++ lösche, es aber mehrfach zuweise?




c++ array ausgeben (4)

Ordnet C ++ bei jeder Verwendung von operator new verschiedene Speicherbereiche zu?

Ja.

Löscht der Operator nur das zuletzt zugeordnete cost ?

Ja.

Du hast die einzigen Hinweise auf die anderen verloren, so dass sie unwiderruflich durchgesickert sind. Um dieses Problem zu vermeiden, jonglieren Sie keine Zeiger, sondern verwenden Sie RAII , um dynamische Ressourcen automatisch zu verwalten. std::vector wäre hier perfekt (wenn Sie überhaupt ein Array benötigen würden; Ihr Beispiel könnte einfach weiterlesen und einen einzelnen int wiederverwenden).

Angenommen, ich habe das folgende Snippet.

int main()
{
    int num;
    int* cost;
    while(cin >> num)
    {
        int sum = 0;
        if (num == 0)
          break;

        // Dynamically allocate the array and set to all zeros
        cost = new int [num];
        memset(cost, 0, num);
        for (int i = 0; i < num; i++)
        {
            cin >> cost[i];
            sum += cost[i];
        }
        cout << sum/num;
    }
`  `delete[] cost;
    return 0;
}

Obwohl ich die delete Anweisung innerhalb der while-Schleife für meinen Code verschieben kann, möchte ich zum Verständnis wissen, was mit dem Code passiert, wie er geschrieben wurde. Ordnet C ++ bei jeder Verwendung von operator new verschiedene Speicherbereiche zu?

Löscht der Operator nur das zuletzt zugeordnete cost ?


Ich rate Ihnen dringend , "C-Idiome" in einem C ++ - Programm nicht zu verwenden. Lass die std Bibliothek für dich arbeiten: deshalb ist sie da. Wenn Sie "ein Array (Vektor) von n ganzen Zahlen" wollen, dann ist das was std::vector und es wird "mit Batterien geliefert." Sie müssen nicht mit Dingen wie "maximale Größe einstellen" oder "null setzen" umgehen. Du arbeitest einfach mit "diesem Ding", dessen Inneres du nicht [musst], weil es weiß, dass es bereits gründlich entworfen und getestet wurde.

Wenn Sie dies tun, arbeiten Sie innerhalb des vorhandenen C ++ - Frameworks für die Speicherverwaltung. Insbesondere tun Sie nichts "out-of-band" in Ihrer eigenen Anwendung, "das die Standard-Bibliothek nicht weiß und das (!!) es könnte."

C ++ bietet Ihnen eine sehr umfangreiche Bibliothek an schnellen, effizienten, robusten und erprobten Funktionen. Nutzen Sie es aus.


Ja. Sie erhalten also für jede Iteration der Schleife ein Speicherleck mit Ausnahme der letzten.

Wenn Sie new , weisen Sie einen neuen Speicherbereich zu. Das Zuweisen des Ergebnisses des new zu einem Zeiger ändert nur, worauf dieser Zeiger zeigt. Es gibt nicht automatisch den Speicher frei, auf den dieser Zeiger zuvor Bezug genommen hat (falls vorhanden).


Jedes Mal, wenn Sie dem Array neuen Speicher zuweisen, wird der zuvor zugewiesene Speicher freigegeben. Als Faustregel gilt, dass Sie den Speicher so oft freigeben müssen, wie Sie zugewiesen haben.







new-operator