Frage

Nachdem ich tun, sagen wir

Foo* array = new Foo[N];

Ich habe es gelöscht immer so

delete[] array;

Aber manchmal habe ich es so gesehen:

delete[N] array;

Wie es (zumindest in msvc2005) zu kompilieren und zu arbeiten scheint, frage ich mich: Was ist der richtige Weg, es zu tun? Warum es anders kompilieren, dann?

War es hilfreich?

Lösung

Sie dies, MSDN Link: löschen [N] Operator . Der Wert wird ignoriert.

Bearbeiten Ich habe versucht, diesen Beispielcode auf VC9:

int test()
{
    std::cout<<"Test!!\n";
    return 10;
}

int main()
{
    int* p = new int[10];
    delete[test()] p;
    return 0;
};

Die Ausgabe ist: Test !!

So wird der Ausdruck ausgewertet, aber der Rückgabewert ignoriert wird. Ich bin überrascht, gelinde gesagt, ich kann nicht von einem Szenario denken, warum dies erforderlich ist.

Andere Tipps

delete [N] array ist ungültig. sonst Abschnitt 5.3.5 definiert einen Löschungsausdruck entweder als delete expr oder delete [] expr, und nichts: Es ist nicht in der C ++ Standard definiert. Es lässt sich nicht kompilieren auf gcc (Version 4.1.2). Wie, warum kompiliert es in Visual C ++: fragen Microsoft

.

delete[] array; ist die richtige Form.

Ob zweiter Fall richtig ist oder nicht, würde ich empfehlen, zunächst ein verwenden, da sie weniger anfällig für Fehler.

Visual Studio erstellt eine Menge Dinge, sollte es nicht.

Der richtige Weg ist delete[] array; zu tun. Ich wusste nicht einmal, delete[N] array; würde kompilieren (und ich bezweifle, es sollte).

Erster Punkt:. Es gibt so gut wie nie einen guten Grund, um die Array Form von neuen zu verwenden oder zu löschen, mit zu beginnen - Verwendung std :: vector (oder einen anderer Behälter) statt

Zweitens: zurück in den dunklen Zeiten der C ++, können Sie die Größe des Arrays angeben mussten Sie das Löschen wurden, also wenn Sie x = new T[N] verwendet, löschen Sie die passende war delete [N] x. Die Anforderung explizit angeben wurde die Größe entfernt lang vor, aber einige Compiler (vor allem denjenigen, die Sorge um die Abwärtskompatibilität mit altem Code) es immer noch ermöglichen.

Wenn Sie nicht wirklich mit einem alten Compiler kompatibel bleiben müssen (eine, die 20 Jahre alt oder so ist), sollten Sie es nicht verwenden. Dann wieder, wenn Sie mit einem Compiler kompatibel bleiben müssen so alt es keine Standard-Container nicht unterstützt, sollen Sie nicht die Array-Form von neu verwendet oder in erster Linie löschen. Einfach aufhören!

, wenn es funktioniert, es ist eine Nicht-Standard-Erweiterung.

delete [] array;   

ist die richtige Form.

delete array; 

wird manchmal auch Arbeit, sondern ist abhängig von der Implementierung (also falsch).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top