Zusammenfassung der Speicherbelegungsregeln
In der folgenden Tabelle sind die wichtigsten Regeln für die Speicherbelegung zusammengefasst.
MIDL-Element | BESCHREIBUNG |
---|---|
Zeiger auf oberster Ebene [ ref] | Muss Nicht-NULL-Zeiger sein. |
Rückgabewert der Funktion | Für Zeigerrückgabewerte wird immer neuer Arbeitsspeicher zugeordnet. |
Zeiger [ eindeutig, out] oder [ ptr, out] | Von MIDL nicht zulässig. |
Zeiger auf nicht oberster Ebene [eindeutig, in, out] oder [ptr, in, out] , der von NULL zu ungleich NULL geändert wird | Clientstubs weisen bei der Rückgabe neuen Arbeitsspeicher auf dem Client zu. |
Zeiger auf nicht oberster Ebene [eindeutig, in, out], der von "ungleich NULL" in "NULL" geändert wird | Der Arbeitsspeicher ist auf dem Client verwaist. Die Clientanwendung ist für das Freigeben von Arbeitsspeicher und die Verhinderung von Verlusten verantwortlich. |
Zeiger auf nicht oberster Ebene [ptr, in, out], der sich von ungleich NULL in NULL ändert | Arbeitsspeicher wird auf dem Client verwaist, wenn kein Alias verwendet wird. Die Clientanwendung ist in diesem Fall für das Freigeben und Verhindern von Speicherverlusten verantwortlich. |
[ref]-Zeiger | Die Clientanwendungsebene wird in der Regel zugeordnet. |
Zeiger ungleich NULL [in, out] | Stubs versuchen, in vorhandenen Speicher auf dem Client zu schreiben. Wenn [Zeichenfolge] und Größe über die auf dem Client zugeordnete Größe hinaus zunimmt, führt dies bei der Rückgabe zu einem GP-Fehler. |
In der folgenden Tabelle sind die Auswirkungen der Schlüsselattribute IDL und ACF auf die Speicherverwaltung zusammengefasst.
MIDL-Feature | Clientprobleme | Serverprobleme |
---|---|---|
[ allocate(single_node)], [allocate(all_nodes)] | Bestimmt, ob ein oder mehrere Aufrufe an die Speicherfunktionen erfolgen. | Identisch mit dem Client, mit Ausnahme des privaten Arbeitsspeichers kann häufig für die Zuordnung (single_node) [in] und [in,out] Daten verwendet werden. |
[allocate(free)] oder [allocate(dont_free)] | (Keine; wirkt sich auf den Server aus.) | Bestimmt, ob arbeitsspeicher auf dem Server nach jedem Remoteprozeduraufruf freigegeben wird. |
Arrayattribute [ max_is] und [ size_is] | (Keine; wirkt sich auf den Server aus.) | Bestimmt die Größe des zuzuweisenden Arbeitsspeichers. |
[ byte_count] | Der Client muss puffern; nicht von Client-Stubs zugeordnet oder freigegeben. | Das ACF-Parameterattribute bestimmt die Größe des puffers, der auf dem Server zugeordnet ist. |
[ enable_allocate] | In der Regel keine. Der Client verwendet jedoch möglicherweise eine andere Speicherverwaltungsumgebung. | Der Server verwendet eine andere Speicherverwaltungsumgebung. RpcSmAllocate sollte für Zuordnungen verwendet werden. |
[ in]attribut | Clientanwendung, die für die Zuweisung von Arbeitsspeicher für Daten verantwortlich ist. | Zugeordnet auf dem Server durch Stubs. |
[ out]-Attribut | Zugeordnet auf dem Client durch Stubs. | [out]-only-Zeiger muss [ref]-Zeiger sein; zugeordnet auf dem Server durch Stubs. |
[ ref]-Attribut | Arbeitsspeicher, auf den der Zeiger verweist, muss von der Clientanwendung zugeordnet werden. | Verweiszeiger der obersten und ersten Ebene, die von Stubs verwaltet werden. |
[ unique]-Attribut | Ungleich NULL bis NULL kann zu verwaistem Arbeitsspeicher führen. Null bis null bewirkt, dass der Clientstub midl_user_allocate aufruft. | (Wirkt sich auf den Client aus.) |
[ ptr]-Attribut | (Siehe [ eindeutig].) | (Siehe [ eindeutig].) |