2 Stimmen

COM-ähnliche Schnittstellen warnen vor nicht virtuellen Destruktoren

Gibt es eine Möglichkeit, gcc zu sagen, dass die abstrakte Klasse, die es kompiliert, nicht einen virtuellen Destruktor benötigt (wie COM-Objekte nie haben)? Zum Beispiel beschwert sich nsISupports immer über den fehlenden virtuellen Destruktor. Das Abschalten der Warnung würde nicht helfen, da ich möglicherweise nicht-COM-ähnliche Klassen habe, bei denen ich diese Warnung haben möchte.

Daher ist __attribute__((com_interface)) veraltet und hat nur das Layout der vtable geändert. Gibt es ein anderes __attribute__, wo ich dem Compiler sagen kann, dass ich nicht über den fehlenden Destruktor dieser Klasse gewarnt werden möchte?

1voto

zebrabox Punkte 5616

Die Warnung vor einem fehlenden virtuellen dtor gibt es aus einem bestimmten Grund - hauptsächlich, weil es ein Alptraum für die Fehlersuche ist, besonders in einer großen und komplexen Codebasis
Vielleicht haben Sie einen ganz bestimmten Grund dafür, aber fragen Sie sich, was passiert, wenn eine Klasse so umstrukturiert wird, dass sich ihre Verwendung später ändert?

1voto

JaredPar Punkte 699699

Ich denke, Sie sollten noch einmal darüber nachdenken, diese Warnung zu deaktivieren. Sie ist aus einem bestimmten Grund da. Es mag heute richtig sein, keinen virtuellen Destruktor in Ihre Klasse einzubauen, aber Sie können nicht genau vorhersagen, wie Ihre Klasse in Zukunft verwendet werden wird.

Eine kleine Änderung in der Art und Weise, wie die Klasse verwendet wird, könnte dazu führen, dass sich der nächste Entwickler stundenlang die Haare rauft, um ein Ressourcenleck aufzuspüren. Tun Sie dieser Person einen Gefallen und machen Sie den Destruktor jetzt virtuell.

Außerdem sollten Sie sich folgende Fragen stellen

Was habe ich davon, wenn ich es nicht virtuell mache?

Sie erwähnten, dass Sie eine abstrakte Klasse haben, also nehme ich an, dass sie zumindest eine einzelne virtuelle Funktion hat. Wenn Sie also den Destruktor virtuell machen, fügen Sie dem Objekt keine V-Tabelle hinzu, sondern erweitern es lediglich um ein weiteres Mitglied.

Ich kann keinen wirklichen Vorteil darin sehen, dies nicht-virtuell zu machen. Nur Probleme.

0voto

David Seiler Punkte 9491

Sie möchten wahrscheinlich ein Paar diagnostische Pragmatiken . Wenn das nicht der Fall ist, #pragma GCC system_header Deaktiviert tous Warnungen in einer bestimmten Datei.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X