2012-10-29 12 views
5

Mein Code kompiliert ohne Fehler, aber was bedeutet das?C++; Was bedeutet die Warnung "standardmäßig aktiviert" während der Kompilierung?

etherate.cpp:432:11: warning: deleting array ‘unsigned char broadMAC [6]’ [enabled by default] 

Es ist von dieser Zeile, wo ich eine vorzeichenlose Char-Array löschen;

delete [] broadMAC; 

Ist es in Ordnung, das so zu lassen, wie es ist, wenn nicht, wie könnte ich das verbessern?

Danke.

UPDATE

Wie wird broadMAC erklärt?

Von ungefähr 10 Zeilen vorher;

unsigned char broadMAC[6] = {destMAC[0], destMAC[1], destMAC[2], destMAC[3], destMAC[4], destMAC[5]}; 

destMAC ist auch ein unsigned char Array mit Werten in ihm gespeichert. Ich musste sie kopieren, etwas mit destMAC machen, dann die ursprünglichen Werte wiederherstellen; also habe ich broadMAC deklariert und möchte es nachher löschen.

+0

wie ist broadMAC erklärt? –

+0

Guter Punkt, ich füge das hinzu! – jwbensley

+0

Nun, es ist jetzt offensichtlich: siehe Luchians Antwort –

Antwort

2

G ++ ermöglicht das Aktivieren und Deaktivieren vieler Warnungen (z. B. -Wctor-dtor-privacy, -Woverloaded-virtual, -W...), indem sie in der Befehlszeile angegeben werden. Einige Warnungen werden aktiviert, ohne dass dies in der Befehlszeile erforderlich ist. Andere müssen explizit angefordert werden.

Also, einige Warnungen sind:

"standardmäßig aktiviert"

und einige sind:

"standardmäßig deaktiviert"

+0

Ich bin mir nicht sicher, dass es jemals "standardmäßig deaktiviert" heißt. Bei Optionen, die normalerweise deaktiviert sind, gibt der Compiler den * Namen der Option * aus, die die Anzeige der betreffenden Diagnose steuert. Wenn Sie nicht möchten, dass der Compiler Sie darüber informiert, verwenden Sie beim Kompilieren die Option '-fno-diagnostics-show-option'. –

+0

Beschreiben, was "standardmäßig aktiviert" ist, ohne darauf hinzuweisen, dass der Code undefiniertes Verhalten aufruft, ist möglicherweise eine zu wörtliche Antwort. :) – Yakk

+1

@Yakk Als ich meine Antwort schrieb, lieferte Luchian Grigore bereits eine perfekte Antwort auf die Mängel. Also gab und hat es keinen Sinn, seine Arbeit zu kopieren. –

13

broadMAC im automatischen Speicher zugewiesen, etwa so:

unsigned char broadMAC[6]; 

und dann rufen Sie

delete[] broadMAC; 

was falsch ist, da man es nicht mit new[] zugewiesen hat.

Mit delete/delete[] auf Speicher mit new/new[] Ergebnisse in undefinierten Verhalten nicht zugewiesen, und der Compiler ist intelligent genug, um in diesem Fall zu erzählen.

Sie müssen sich nicht darum kümmern, den Speicher freizugeben, er wird automatisch freigegeben.

+0

Danke @ Luchian Grigore, das sind ein paar gute Infos! Ich war wirklich mehr verwirrt durch die "standardmäßig aktiviert" -Meldung, aber das ist immer noch wichtig zu wissen, was verursacht, dass mein Compiler die Nachricht zu erfassen und zu generieren, und wie man es mindern kann, also danke! +1 – jwbensley

2

Sie versuchen, ein Array freizugeben, das Sie im Stapel zugewiesen haben, nicht Heap. Wenn sich die Variable außerhalb des Gültigkeitsbereichs befindet, wird sie sich selbst befreien und Sie sollten sie nicht explizit freigeben.

+0

Hallo @JosephH, bitte beachten Sie meinen Kommentar zu Luchian Grigore, deshalb habe ich Olaf Dietsche als korrekt markiert, aber auch Ihnen nochmals Dank für einige gute Kenntnisse! :) – jwbensley

Verwandte Themen