Problem bei malloc() und free() C++
Problem bei malloc() und free() C++
Guten Tag,
durch den Aufruf die Funktion z.B. char *p =(*char) malloc(8), wird ein Prozess interne Speicher alloziert. Der Zeiger p wird die Anfangsadresse des Speicher zugewiesen. Könnte Jemand mir sagen, ob ich den ID von dem gerade allozierten Speicher ermitteln kann?
Ich habe noch ein Problem bei einem Sonderfall. Char *i , Zeiger i zeigt auf am Anfangsadresse eines Hauptspeicher und jetzt wird es ein Prozess interne Speicher durch p = (*char) malloc(8) übergegeben. (Wegen der Anwendung ist es die einzige Idee, die ich bisher gefunden habe) Nach die Bearbeitung ist was in dem Prozess interne Speicher gespeichert worden. Nun möchte ich mit Free (P) am Ende des Programms den Prozess interne Speicher freigeben. Es tretet ein Problem auf, das Zeigt, wegen Zugriffsrecht ist es nicht erfolgreich durchgeführt.
Kann Jemand mir sagen, woran liegt der Fehler. Danke im Voraus.
Viele Grüße,
Chunya
durch den Aufruf die Funktion z.B. char *p =(*char) malloc(8), wird ein Prozess interne Speicher alloziert. Der Zeiger p wird die Anfangsadresse des Speicher zugewiesen. Könnte Jemand mir sagen, ob ich den ID von dem gerade allozierten Speicher ermitteln kann?
Ich habe noch ein Problem bei einem Sonderfall. Char *i , Zeiger i zeigt auf am Anfangsadresse eines Hauptspeicher und jetzt wird es ein Prozess interne Speicher durch p = (*char) malloc(8) übergegeben. (Wegen der Anwendung ist es die einzige Idee, die ich bisher gefunden habe) Nach die Bearbeitung ist was in dem Prozess interne Speicher gespeichert worden. Nun möchte ich mit Free (P) am Ende des Programms den Prozess interne Speicher freigeben. Es tretet ein Problem auf, das Zeigt, wegen Zugriffsrecht ist es nicht erfolgreich durchgeführt.
Kann Jemand mir sagen, woran liegt der Fehler. Danke im Voraus.
Viele Grüße,
Chunya
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Problem bei malloc() und free() C++
Hi und Willkommen im ForumGuten Tag,

Es gibt keine "ID" für Speicher. Es gibt nur die Adresse und die ist in "p" gespeichert und kann man überKönnte Jemand mir sagen, ob ich den ID von dem gerade allozierten Speicher ermitteln kann?
Code: Alles auswählen
printf("%d", p);
Kleine Anmerkung
Code: Alles auswählen
char *p =(*char) malloc(8);
Malloc reserviert Speicher der Größe, wie du ihn übergibst. Die Größe des Speicher sollte aber nie fest Eincodiert sein, wie hier, da sonst dein Programm bei kleinen Änderungen, wenn z.B mehr Speicher gefordert wird, Fehler verursachen wird.
Es kann entweder sein, dass du Thread-übergreifende Probleme hast oder das der Speicher schon freigegeben wurde an irgendeiner Stelle.Nun möchte ich mit Free (P) am Ende des Programms den Prozess interne Speicher freigeben. Es tretet ein Problem auf, das Zeigt, wegen Zugriffsrecht ist es nicht erfolgreich durchgeführt.
Genaues kann man aber erst sagen, wenn man den Code sieht.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem bei malloc() und free() C++
Bitte (char *) schreiben. C++ ist nicht Java, es gibt keine Id.Chunya hat geschrieben:durch den Aufruf die Funktion z.B. char *p =(*char) malloc(8), wird ein Prozess interne Speicher alloziert. Der Zeiger p wird die Anfangsadresse des Speicher zugewiesen. Könnte Jemand mir sagen, ob ich den ID von dem gerade allozierten Speicher ermitteln kann?
In C++ ist es ratsam new und delete statt malloc() und free():
Code: Alles auswählen
char *p = new char[8];
Ich bin nichtmals sicher, ob ich verstehe, was Du da tust. Was ist für Dich ein Prozess?Chunya hat geschrieben:Ich habe noch ein Problem bei einem Sonderfall. Char *i , Zeiger i zeigt auf am Anfangsadresse eines Hauptspeicher und jetzt wird es ein Prozess interne Speicher durch p = (*char) malloc(8) übergegeben. (Wegen der Anwendung ist es die einzige Idee, die ich bisher gefunden habe) Nach die Bearbeitung ist was in dem Prozess interne Speicher gespeichert worden. Nun möchte ich mit Free (P) am Ende des Programms den Prozess interne Speicher freigeben. Es tretet ein Problem auf, das Zeigt, wegen Zugriffsrecht ist es nicht erfolgreich durchgeführt.
Kann Jemand mir sagen, woran liegt der Fehler. Danke im Voraus.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem bei malloc() und free() C++
Ähm.Xin hat geschrieben: ...In C++ ist es ratsam new und delete statt malloc() und free():...Code: Alles auswählen
char *p = new char[8];
Natürlich weiß ich, daß es hier offensichtlich eigentlich noch um ganz grundsätzliche Programmierproblemchen geht, aber das kann ich so nicht stehen lassen (vielleicht bin ich ja altmodisch, aber mich friert's jedesmal, wenn ich Ähnliches lese), deshalb ein paar eher "philosophische" Gedanken dazu:
_Ich_ finde dieses Statement nämlich überhaupt nicht "ratsam". Bevor man so was in einem Programm hinschreibt, sollte man sich m.E. zweimal überlegen, ob man bein Design nicht irgendwas grundsätzlich falsch gemacht hat.
"new char[8]" reserviert 8 Bytes Heap-Speicher. Dazu den Speicherplatz, den p belegt (auf einer 64-Bit Maschine nochmal 8 Byte auf dem Stack oder im Datensegment). Wahrscheinlich läuft das noch auf einer Maschine, die aus Geschwindigkeitsgründen Speicher nur auf durch 16 teilbaren Adressen rausrückt (dabei gehen u.U. noch mal 8 Bytes durch das Alignment drauf).
Das Statement verbraucht also mal eben u.U. 24 Byte Speicher für eine Variable, die ganz ohne Quetschen (ohne jeglichen Speicherverbrauch) auch in ein Prozessorregister gepaßt hätte. Ein ziemlich unsinniges Verhältnis von Nutzdaten zu Verwaltungsdaten, finde ich.
Moderne Rechner haben endlos Speicher und sind wahnsinnig schnell (zumindest im Vergleich zu dem, mit dem ich mal das Programmieren angefangen habe). Das ist aber längst kein Grund, diese Leistungsfähigkeit mal eben "durch den Kamin zu jagen". Auch schnelle Rechner machen mit langsamen Programmen keinen Spaß

Früher (als die Zeiten noch Zeiten waren) wäre kein Mensch auf die Idee gekommen, einem Anfänger die dynamische Speicherverwaltung anhand von "malloc(4)" zu erklären. "new char[8}" ist eigentlich genau dasselbe, scheint aber niemanden zu stören.
Nur mal so als Denkanstoß. Nix für ungut.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Problem bei malloc() und free() C++
Das kann nie schaden.mfro hat geschrieben:_Ich_ finde dieses Statement nämlich überhaupt nicht "ratsam". Bevor man so was in einem Programm hinschreibt, sollte man sich m.E. zweimal überlegen, ob man bein Design nicht irgendwas grundsätzlich falsch gemacht hat.Xin hat geschrieben: ...In C++ ist es ratsam new und delete statt malloc() und free():...Code: Alles auswählen
char *p = new char[8];
Die Frage ist immer, wozu braucht man es. Und Heap-Speicher braucht man immer dann, wenn man nach Verlassen dieser Funktion das Element noch weiter verwenden möchte, sonst könnte man es auch auf dem Stack anlegen.
Ansonsten könnte man 8 Byte auch gut kopieren, aber das ergibt nur dann einen Sinn, wenn die 8 Byte nicht zur Kommunikation verwendet werden, dann müssen alle mit der gleichen Speicherstelle sprechen.
Ein sehr wahres Wort... (sogar zwei Sätze^^)mfro hat geschrieben:Moderne Rechner haben endlos Speicher und sind wahnsinnig schnell (zumindest im Vergleich zu dem, mit dem ich mal das Programmieren angefangen habe). Das ist aber längst kein Grund, diese Leistungsfähigkeit mal eben "durch den Kamin zu jagen". Auch schnelle Rechner machen mit langsamen Programmen keinen Spaß.
Ich weiß noch nicht, worum es hier geht, entsprechend ist es zu früh bessere Alternativen vorzuschlagen. Ansonsten wüsste ich nicht, wenn man sich auf einen Beispielfall einigt, warum man die Beispiele der dynamische Speicherverwaltung mit großen Speicherblöcken durchführen müsste. Irgendein Beispiel muss man nehmen - ob das jetzt 8 Byte oder 8 Kilobyte sind.mfro hat geschrieben:Früher (als die Zeiten noch Zeiten waren) wäre kein Mensch auf die Idee gekommen, einem Anfänger die dynamische Speicherverwaltung anhand von "malloc(4)" zu erklären. "new char[8}" ist eigentlich genau dasselbe, scheint aber niemanden zu stören.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Problem bei malloc() und free() C++
Guten Tag,
viele Danke für alle Ihre Idee. Ich finde, es wäre besser, dass ich ein paar Code in meinen Programm zeigen soll, damit ich mehr Idee von Ihnen einsammeln kann.
Mein Programm geht es um ein digitale Kamera (IDS UI-1222LE-M), ein Bild aufzunehmen und in ein Datei zu speichern.
Bei der Ausführung, würde ein Fehlermeldung bei entweder is_ImageFile oder free auftauchen, der sagt, ein Haltenpunkt wird ausgelöst und danach sagt er irgend ein Problem in Heap. Aber die Funktion ist erfolgreich, das heißt, ein aktuelle Bild wird in ein JPG Datei gespeichert.
Viele Danke,
Chunya
Edit by cloidnerux: code tags hinzugefügt.
viele Danke für alle Ihre Idee. Ich finde, es wäre besser, dass ich ein paar Code in meinen Programm zeigen soll, damit ich mehr Idee von Ihnen einsammeln kann.
Mein Programm geht es um ein digitale Kamera (IDS UI-1222LE-M), ein Bild aufzunehmen und in ein Datei zu speichern.
Code: Alles auswählen
/*
- Diese Funktion ist aus der Bibliothek von IDS, die alloziert ein Speicher in Hauptspeicher durch den Treiber;
- m_hCam ist Kamera Handl;
- m_pcImageMemory ist ein Zeiger, nach der Aufruf die Funktion, wird der auf die Anfangsadresse des Hauptspeicher zeigt;
- m_nMemoryId ist den Speicher ID, der wird auch nach der Aufruf diese Funktion erzeugt.
- hier benuzte ich die Funktion, um &m_pcImageMemory bzw. &m_nMemoryId später(für is_SetImageMem ) verwenden zu können
*/
nRet = is_AllocImageMem(m_hCam, m_nSizeX, m_nSizeY, m_nBitsPerPixel, &m_pcImageMemory, &m_nMemoryId);
if(nRet == IS_SUCCESS)
{
cout << " Allocating an image memory is success." << endl;
if(m_pcImageMemory != NULL)
{
/* Aktivieren den mit Funktion is_AllocImageMen allozierte Funktion, da die Funktion is_FreezeVideo nimmt ein Bild auf, und speichert automatisch nur in ein mit is_SetImageMem aktivierte Speicher. */
nRet_a = is_SetImageMem(m_hCam, m_pcImageMemory, m_nMemoryId);
cout << " An image memory is aktive. " << endl;
/* Stellen den Bild darstellungsmodi */
nRet_m = is_SetDisplayMode(m_hCam, IS_SET_DM_DIB);
/*
- hier möchte ich ein Speicher in USER MEMORY allozieren, statt in Hauptspeicher
- Da später wollen wir auch auf den Bild zugreifen, um den Bild weiter zu bearbeiten
- Die Größe 400000 setze ich genug groß ein, ist es ja nur zu testen
- die Zeiger m_pcImageMemory von Funktion is_AllocImageMem wieder verwendet, ist mir absichtlich, denn sonst kann ich die Funktion is_SetImageMem nicht benuzten, weil mir durch malloc fehlt ein Speicher ID */
m_pcImageMemory = (char*) malloc (400000);
if( m_pcImageMemory == NULL)
exit(1);
if(m_hCam != 0)
{
/*
- Diese Funktion nimmt ein Bild auf und speichert in aktiviert USER MEMORY
- IS_WAIT is 60s by standard.
*/
int nRet_p = is_FreezeVideo(m_hCam, IS_WAIT); // Take a picture.
if(nRet_p == IS_SUCCESS)
{
cout << " It has taken a Picture." << endl;
}
/*
Die Funktion is_ImageFile wird auf den Daten in aktivierte Speichern zugreifen, und speichert den Daten in ein JPG Datei.
*/
IMAGE_FILE_PARAMS ImageFileParams ;
UINT id = (UINT) m_nMemoryId;
ImageFileParams.pwchFileName = L"d:\\test.jpg";
ImageFileParams.ppcImageMem = NULL ;
ImageFileParams.nQuality = 0;
ImageFileParams.nFileType = IS_IMG_JPG;
cout << "sizeof(ImageFileParams) ist " << sizeof(ImageFileParams) << endl;
nRet_s = is_ImageFile(m_hCam, IS_IMAGE_FILE_CMD_SAVE,(void*)&ImageFileParams, sizeof(ImageFileParams));
free(m_pcImageMemory);
}
}
}
Viele Danke,
Chunya
Edit by cloidnerux: code tags hinzugefügt.
Re: Problem bei malloc() und free() C++
Ich bin weit davon entfernt, wirklich zu verstehen, was Du da genau machst (deswegen ist das meiste, was unten kommt, geraten), aber das kann meiner Ansicht nach so nicht richtig sein.Chunya hat geschrieben:Code: Alles auswählen
nRet = is_AllocImageMem(m_hCam, m_nSizeX, m_nSizeY, m_nBitsPerPixel, &m_pcImageMemory, &m_nMemoryId); ... m_pcImageMemory = (char*) malloc (400000); ... free(m_pcImageMemory); ...
Die Library, die vom Kamerahersteller bereitgestellt wird, enthält offensichtlich die Bibliotheksfunktion is_AllocImageMem(), die Speicher allokiert, in den der Treiber/die Library aufgenommene Bilder abspeichern kann. Das _ist_ bereits Heap-Memory und keinesfalls irgendein besonderer Speicher.
Dein Problem - soweit ich das verstehe (wie gesagt, ist geraten) - dürfte sein, daß es zu dieser Bibliotheksfunktion bestimmt ein Gegenstück in der Library gibt, mit dem man diesen Speicher wieder "abmelden" und freigeben muß.
Du hast allerdings mit malloc() den Pointer, der ursprünglich benutzt wurde, überschrieben (damit ist der von der Library-Funktion allokierte Speicher nicht mehr erreichbar - "orphaned") und mit free(m_pcImageMemory) den erreichbaren, "neuen" Speicher schon selbst freigegeben. Damit muß die Bibliotheksfunktion in jedem Fall scheitern (weil sie versucht, Speicher freizugeben, der bereits freigegeben ist), zusätzlich hast Du ein heftiges Memory-Leak.
Ich nehme an, daß man is_AllocImageMem() auch mehrfach aufrufen kann? Dann wäre meiner Ansicht nach der richtige Weg, über zwei Zeiger zwei Image-Buffer zu allokieren. In einen läßt man jeweils die Kamera ihre Bilder aufnehmen. Wenn Du dann ein Bild abspeichern willst, bringst Du die Library (irgendwie) dazu, solange den anderen Puffer zu verwenden (das geht bestimmt irgendwie, sonst würde m_nMemoryId keinen Sinn machen). Jetzt kannst Du den ersten Puffer verwenden, um dein Image-File abzuspeichern.
Macht das irgendwie Sinn?
P.S.: anscheinend ist deutsch nicht deine Muttersprache, wenn Du mit englisch mehr anfangen kannst, mußt Du es nur sagen.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Problem bei malloc() und free() C++
Haltepunkt klingt nach Debugger? Mal nachgeschaut, ob da irgendwelche Haltepunkte gesetzt sind?, der sagt, ein Haltenpunkt wird ausgelöst
Alles liegt im Arbeitsspeicher, der unterschied zwischen "User Memory" und "System" liegt nur in den Rechten und dem paging, das sollte für euch aber keine Rolle spielen, da das Bild ja in dem Speicher liegen muss, den- hier möchte ich ein Speicher in USER MEMORY allozieren, statt in Hauptspeicher
Code: Alles auswählen
nRet = is_AllocImageMem(m_hCam, m_nSizeX, m_nSizeY, m_nBitsPerPixel, &m_pcImageMemory, &m_nMemoryId);
Und hier sagst du auch selber, warum dein Programm nicht funktioniert:
Du überschreibst einen Pointer ohne den Speicher freizugeben, der vorher da alloziert war, kein Wunder das alles mögliche Passiert.die Zeiger m_pcImageMemory von Funktion is_AllocImageMem wieder verwendet, ist mir absichtlich, denn sonst kann ich die Funktion is_SetImageMem nicht benuzten, weil mir durch malloc fehlt ein Speicher ID */
Zudem überschreibst du den Pointer, dabei hättest du auch Problemlos eine neue Variable dafür anlegen können.
Und, wie schon einmal gesagt: Es gibt keine "Speicher ID". Ein Speicher ist in C/C++ durch seine Addresse gekennzeichnet, die in einem Pointer gespeichert ist. Wie groß der Speicher ist, muss der Programmierer selber wissen und sicherstellen, dass genug Speicher da ist.
Funktionen wie "malloc" oder "is_AllocImageMem" geben einen Pointer zurück, die Adresse von dem ersten Byte des Speichers, an dem eben entsprechend viel Speicher reserviert wurde.
Wird speicher nicht wieder frei gegeben, wird über die Speichergrenzen hinaus geschrieben oder findet eine Rechteverletzung statt löst das Betriebssystem eine Exception aus und beendet dein Programm.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Problem bei malloc() und free() C++
Guten Tag,
ich glaube, ihr beide habt den Grund für mein Problem gezeigt. Wie Cloidnerux geschriebe hat: "Du überschreibst einen Pointer ohne den Speicher freizugeben, der vorher da alloziert war, kein Wunder das alles mögliche Passiert."
Danke schön!
[img]d://BILD.PNG_url[/img]
Daher habe ich keine gut Lösung für das Problem...
mfro hat mir eine schöne Idee gegeben. Soweit ich das verstanden habe, das wäre den nächste Schritt für dem Programm. Denn ich möchte zuerst ein einzige Bild aufnehmen und dann speichern. Wenn alles in diesen Schritt funktioniert, dann mache ich weiter.
Viele Grüße,
Chunya
ich glaube, ihr beide habt den Grund für mein Problem gezeigt. Wie Cloidnerux geschriebe hat: "Du überschreibst einen Pointer ohne den Speicher freizugeben, der vorher da alloziert war, kein Wunder das alles mögliche Passiert."
Danke schön!
Ja, is_FreeImageMem() ist die.mfro hat geschrieben:
Dein Problem daß es zu dieser Bibliotheksfunktion bestimmt ein Gegenstück in der Library gibt, mit dem man diesen Speicher wieder "abmelden" und freigeben muß.
Du hast Recht, bei Verwendung von is_AllocImageMem() kann ein Bild in dem allozierten Speicher anlegen, das habe ich mit Debug auch gesehen, allerdings gibt es ein Problem von Zugriffsrecht, wenn ich mit den Funktion is_ImageFile() versuchen, den Bild aus den Speichern aufzugreifen und in JPG Datei abzuspeichern. Aber mit den Speichern von malloc () geht. Daher dachte ich, dass den Speichern von is_AllocImageMem() alloziert wird, legt in dem Hauptspeichern. Außerdem zeigt es in dem folgende Bild aus den Handbuch:Cloidnerux hat geschrieben:
der unterschied zwischen "User Memory" und "System" liegt nur in den Rechten und dem paging.
[img]d://BILD.PNG_url[/img]
Daher habe ich keine gut Lösung für das Problem...
mfro hat mir eine schöne Idee gegeben. Soweit ich das verstanden habe, das wäre den nächste Schritt für dem Programm. Denn ich möchte zuerst ein einzige Bild aufnehmen und dann speichern. Wenn alles in diesen Schritt funktioniert, dann mache ich weiter.
Viele Grüße,
Chunya