Frage zu Strukturen der Win API



  • Morgen sollte man möglichst immer die Strukturen mit Werten initialiseren oder ist das egal?

    Also z.b.

    ZeroMemory(&IrgendeineStruktur,sizeof(IrgendeineStruktur));



  • Das sollte man auch heute machen.



  • Ich würde mal sagen: Das hängt davon ab...



  • I.d.R. hängt das von der Doku ab... wenn dort steht, dass es IN/OUT ist, dann muss man es (wobei man dann i.d.R. auch ein "Len-Field" füllen muss); bei nur OUT muss man es nicht... (was einen natürlich nicht davon abhält es trotzdem zu tun).



  • Ich mache das meistens so. Einfach um sicher zu sein dass die Struktur mit 0 aufgefüllt ist, denn eine 0 als Parameterwert wird in vielen Fällen als leeren Datentyp gewertet.

    Einige Strukturen sind in der WinAPI auch durch den Präprozessor abhängig definiert s.d. bei beispielsweise _WIN32_WINNT >= 0x0500 die Struktur OPENFILENAME einige Member mehr aufweist. Hat man dann die OPENFILENAME per Hand initialisiert und stellt man dann WIN XP Unterstützung ein, kann dass zu unerwarteten Nebeneffekten führen, wenn die Funktion auf FlagsEx zugreift, welche durch den Compiler auf 0xCCCCCCCC (Debug Stack) gesetzt wird.

    Das sind Fehler die man durch ein ZeroMemory() vermeiden kann.



  • Bitte ein Bit schrieb:

    Das sind Fehler die man durch ein ZeroMemory() vermeiden kann.

    Ich hab aber auch schon Fehler gesehen, die durch das ZeroMemory() erst entstanden sind. Das pauschale ZeroMemory() verschleiert was für Member eigentlich initialisiert werden. Man sieht das ZeroMemory() und sucht studenlang am falschen Fleck, weil dort oben kann ja nix schiefgehen, ist ja ein ZeroMemory() da. Und dann gibts doch irgendwann mal einen Member der vergessen wurde, der nicht 0 sein darf, ...
    Ich hab mir angewöhnt, einfach die Doku zu lesen und jeden benötigten Member explizit zu initialisieren. Jeder vernünftige Debugger füllt die Struktur sowieso mit Werten wie 0xCCCCCCCC, sodass eine fehlende Initialisierung beim Debuggen sofort auffällt (imo sogar wesentlich besser als wenn einfach alle Wert "per default" auf 0 wären). Imo bringt so ein ZeroMemory() jedenfalls keinen wirklichen Nutzen, im Gegenteil, es verschleiert was eigentlich genau für Werte übergeben werden. Zusätzlich ist es natürlich unschön, da gewisse Werte potentiell unnötigerweise mehrfach beschrieben werden...



  • weil dort oben kann ja nix schiefgehen, ist ja ein ZeroMemory() da

    Ich glaube alleine der Gedanke hieran ist schon ein Fehler. Ein ZeroMemory entbindet natürlich nicht davon anständig in die Doku zu schauen.

    Jeder vernünftige Debugger füllt die Struktur sowieso mit Werten wie 0xCCCCCCCC, sodass eine fehlende Initialisierung beim Debuggen sofort auffällt

    Hmm, ein 0xCCCCCCCC fällt mir leider genauso wenig auf wie ein 0x0. Gibt es da irgentwelche Hilfsmittel um so was zu sehen ? (ala _ASSERT() ?).

    Ich emfinde halt an gewisssen Ecken und Kanten (Zeiger, (String) Array's) eine 0 als besseren Standardwert. Wobei es definitiv auch Ausnahmen gibt.

    Man mag aber nun auch darüber streiten welcher Standardwert schädlicher ist. Ich fürchte, man kann es nicht pauschalisieren.


  • Mod

    Ich verwende meistens grundsätzlich ZeroMemory. Meistens weil auch ein Teil unseres Teams auch Konstruktoren mit Initialsiierungslisten verwenden.

    Aber 0 ist mir sicherer als 0xcc oder Garbage, denn so Verhalten sich Debug und Release Version wenigstens gleich "falsch"...


Anmelden zum Antworten