Richtigen Weg, in der Nähe WinAPI Griffe (Vermeidung von wiederholten schließen)

Habe ich einige mit und ich brauchen, um es zu schließen. Es gibt einige stellen im code, wo der Griff wieder geschlossen werden kann. Also, das ist eine richtige Weg, um in der Nähe behandeln?

HANDLE h;
....
if ( h != INVALID_HANDLE_VALUE ) {
  ::CloseHandle(h);
  h = INVALID_HANDLE_VALUE;
}

Es ist eine Frage der bitmap-handles:

HBITMAP hb;
....
if ( hb != INVALID_HANDLE_VALUE ) {
  ::DeleteObject(hb);
  hb = INVALID_HANDLE_VALUE;
}

EDIT: ich denke, es gibt einige Missverständnisse. Ich weiß CloseHandle ist für das schließen der Griffe. Ich würde gerne wissen, die richtige Art und Weise für das schließen der Griffe. Ähnliche Situationen Auftritt, die mit dem löschen der Zeiger.

Foo *foo = new Foo();

//for example there is 2 functions that can delete foo
void bar() {
  ....
  delete foo;
}
void duck() {
  ....
  delete foo;
}

So, der folgende code bedeutet Probleme:

bar();
duck();

Gibt es einige workaround für diesen Fall. Wir müssen definieren bar&duck Funktionen wie diese:

void bar() {
  ....
  if (foo) {
    delete foo;
    foo = NULL;
  }
}
void duck() {
  ....
  if (foo) {
    delete foo;
    foo = NULL;
  }
}

Also, wir vermeiden Sie ein wiederholtes löschen von foo. Die Frage ist, Was ist der richtige Weg, um in der Nähe der Griffe? Ich meine, Wie vermeiden Sie ein wiederholtes schließen Griffen problem?

Die Antwort mag Sie überraschen, aber ja, wenn die Dokumentation nicht anders, dann CloseHandle ist in der Tat die korrekte Funktion zu nennen, wenn Sie wollen, schließen Sie einen Griff. Aber es gibt einige Ausnahmen, einige Funktionen erstellen behandelt, die geschlossen werden sollten, unterschiedlich. Also entweder zeigen Sie uns, wie das handle erstellt wurde, oder schauen Sie sich auf der MSDN-Website 🙂
Der Punkt ist, dass kernel-handles geschlossen mit CloseHandle, während andere Griffe (in der Regel GDI-handles) haben Ihre eigene Funktion. Noch auf der MSDN-Seite über die Funktion dient zur Erfassung der Griff ist immer aufgeführt, die die entsprechende Funktion aufrufen, um Sie freizugeben.
Die überprüfung und Einstellung für INVALID_HANDLE_VALUE kann gut sein, sinnlos, wenn das handle geschlossen werden kann, aus mehreren Fäden, die Sie benötigen, um vorbereitet zu sein für CloseHandle() nicht ohnehin.
Wenn ein handle geschlossen werden kann von mehreren threads ohne Synchronisation, haben Sie viel schlimmere Probleme als CloseHandle scheitern. Der Griff wiederverwendet wird, indem der kernel und du wirst dann etwas in der Nähe, die Sie nicht beabsichtigen zu schließen. Dieses problem kann sehr schwer aufzuspüren, weil es nie reproduziert die gleiche Weise zweimal.

InformationsquelleAutor Loom | 2012-10-23

Schreibe einen Kommentar