Verwendung von HeapAlloc
-
FrEEzE2046 schrieb:
Ist mir bekannt, deshalb möchte ich ja auch HeapAlloc nutzen

Außerdem muss es ja schließlich eine korrekte Verwendung von HeapAlloc geben, nicht wahrund wieseo stellst du diese Frage im Ansi C Forum?

-
general bacardi schrieb:
Ja dazu mußt Du dir das hier durchlesen http://msdn.microsoft.com/en-us/library/aa366597(VS.85).aspx
Nunja, ich habe natürlich vorher die MSDN bemüht, bevor ich hier einen Thread erstellt habe. Ich erkenne jedoch meinen Fehler immer noch nicht, da es auch im verlinkten Beispiel nicht viel anders gemacht wird.
supertux schrieb:
und wieseo stellst du diese Frage im Ansi C Forum?

Gut, eigentlich quatsch. Ich bin mir aber nicht sicher, ob mein Fehler bei der Verwendung der Funktion selbst oder etwas anderem liegt.
-
der code ist in ordnung. der fehler muss woanders liegen bzw. wieviele solcher oder andere allozierungsaufrufe hast du vorher getätigt.
-
wind00fexperte schrieb:
der code ist in ordnung. der fehler muss woanders liegen bzw. wieviele solcher oder andere allozierungsaufrufe hast du vorher getätigt.
Also,
ich hab jetzt extra nochmal ein neues Projekt erstellt. Eine einfache Konsolenanwendung zum Test.
Hier der Code dazu:
#include <windows.h> #include <iostream> using namespace std; typedef struct mystruct { int x, y, z; } MY_STRUCT, *PMY_STRUCT; int main( int argc, char** argv ) { PMY_STRUCT MyStruct[2]; for( int i = 0; i < 2; i++ ) { MyStruct[i] = (PMY_STRUCT)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MY_STRUCT) ); MyStruct[i]->x = (i+1)*10; MyStruct[i]->y = (i+1)*20; MyStruct[i]->z = (i+1)*30; } HeapFree( GetProcessHeap(), 0, MyStruct ); return 0; }Interessanter weiße funktioniert es jetzt plötzlich, obwohl es gestern Abend mit gleichem Test nicht wirklich funktionieren wollte. Ich werde es jetzt nochmal mit meinem eigentlichen Code testen.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Gibt es generell Probleme beim Aufruf von HeapAlloc aus einer anderen Funktion heraus?
Ich habe festgestellt, dass der Fehler genau dort bei mir liegt. Rufe ich die Funktion direkt auf, z.B. so:
PMessageParams Msg[] = { { (MessageParams*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MessageParams) ), }, { (MessageParams*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MessageParams) ), }, };dankk funktioniert es. Gehe ich dagegen über folgende Funktion an die Sache heran:
template< class T > inline bool AllocateThreadData( T* ThreadData ) { ThreadData = (T*)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(T) ); return (ThreadData != NULL); }Ist zwar innerhalb der Funktion selbst der Speicher allokiert, beim Rücksprung aber wieder weg ...
Ich bin mir sicher gleich belehrt zu werden, wie logisch dass doch ist

Wenn ja, dann aber die Frage: Wie kann ich das "Problem" anders lösen?
-
Ist doch logisch, denn dein Pointer, den du in der Funktion benutzt, ist ja nur lokal. Was du willst ist T** ThreadData

-
h@cK3R schrieb:
Ist doch logisch, denn dein Pointer, den du in der Funktion benutzt, ist ja nur lokal. Was du willst ist T** ThreadData

Jetzt mal im ernst:
Wie kann man so bescheuert sein?
-
FrEEzE2046 schrieb:
h@cK3R schrieb:
Ist doch logisch, denn dein Pointer, den du in der Funktion benutzt, ist ja nur lokal. Was du willst ist T** ThreadData

Jetzt mal im ernst:
Wie kann man so bescheuert sein?
kA

-
FrEEzE2046 schrieb:
h@cK3R schrieb:
Ist doch logisch, denn dein Pointer, den du in der Funktion benutzt, ist ja nur lokal. Was du willst ist T** ThreadData

Jetzt mal im ernst:
Wie kann man so bescheuert sein?
Jaja ... da sind wieder die lokalen Forentrolle. Soso - "bescheuert" ist man also, wenn man erwartet dass ein DYNAMISCH ERZEUGTER, FÜR DEN _PROZESS_ GÜLTIGEN Speicher auch ausserhalb der Funktion gültig ist?
Geht mal lieber wieder im Sandkasten spielen ...Was er will ist natürlich nachvollziehbar und sollte eigentlich Standard-Verhalten sein - schliesslich reserviert man sich den Speicher nicht umsonst, allerdings macht da die WINAPI nen Strich durch die Rechnung und löscht den Speicher nach Verlassen der Funktion - umgehen lässt sich der Unfug unter anderem mit "LocalAlloc", darüber erstellte Speicher sind garantiert bis zum Prozessende gültig - leider ist LocalAlloc nicht besonders performant ... aber bei wenigen hundert Bytes macht das nichts

Mehr dazu hier :
http://msdn.microsoft.com/en-us/library/aa366723(VS.85).aspx
http://msdn.microsoft.com/en-us/library/aa366596(VS.85).aspx
-
ahja, einer noch :
LMEM_ZEROINIT und LMEM_FIXED sind dein Freund :D, aber man sollte die Speicher dann natürlich zentral und serialisiert verwalten - damit übernimmt dann der Entwickler (also du) die Verwantwortung. Is eben nichts für 1337h4xx0r - Kiddies :p
Viel Spaß und gutes Gelingen.