Autor Beitrag
tomycat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162
Erhaltene Danke: 1



BeitragVerfasst: Di 22.08.17 09:30 
hallo,
die malloc Funktion ist eine tolle Funktion :-)
Zu meinem problem, ich habe mehrere Beispiel gefunden, aber so richtig klar ist es mir nicht.

Mit malloc resaviert man Speicher und free gibt man ihn wieder frei. Aber ich habe nicht Beispiel gesehen wie, das passiert, wenn man nicht malloc/free verwendet.


Moderiert von user profile iconTh69: Topic aus Andere .NET-Sprachen verschoben am Di 22.08.2017 um 13:12
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 22.08.17 11:01 
Guten Tag tomycat,

malloc() und free() haben in der Sprache C ihre Berechtigung. Mit C++ kam das new hinzu, was genauso viel bewirkt wie malloc(). Das new wird dir in C# und Java auch untergekommen sein. ;)
Wenn du etwas für die Nostalgie und Pointer übrig hast, kannst du gern auf solch alte Funktionen zugreifen. Was C# und Ponter betrifft, hatten wir schon ein Thema dazu.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162
Erhaltene Danke: 1



BeitragVerfasst: Di 22.08.17 11:13 
sorry, es handelt sich um die Sprache C. Richtung php Erweiterung.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Di 22.08.17 11:36 
Solche (un)wichtigen Details hättest du ruhig erwähnen und in den Tags oberhalb setzen können. :mrgreen:
Zumindest was C betrifft, wirst du um malloc() nicht herum kommen, wenn du an einer Stelle unbedingt Speicher reservieren musst.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162
Erhaltene Danke: 1



BeitragVerfasst: Mi 23.08.17 10:21 
Es ist alles richtig, was du geschrieben hast :-)

Ich stelle jetzt meine Frage mal anderst.
Laut Buch steht drin, man muss bei Motoradfahren einen Helm tragen, sonsten bekommet man ärger mit der Polizei. Dann gibt es blaue grüne und rote Motoradhelme...
Alles recht und schön. Meine Frage ist: Wann genau ist der Helm wichtig? Es kommt zum Unfall, was passiert dann alles, was könnte passieren?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4191
Erhaltene Danke: 831


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 23.08.17 11:36 
Zitat:
Es kommt zum Unfall, was passiert dann alles, was könnte passieren?


Wenn du Methoden zum Speicher allozieren falsch benutzt komt es zu Speicher Problemen :gruebel: Also primär Speicherlecks bis dein Speicher aus ist und dein Programm abschmiert.
Du scheinst eine spezielle Antwort zu wünschen aber das geht bei einer so allgemeinen Frage eher nicht.

Für diesen Beitrag haben gedankt: tomycat
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 23.08.17 11:46 
Puuh, jetzt hat Ralf Jansen meine ausstehende Parkplatz-Metapher ruiniert. :crying:
Kurz gesagt: Wird für einen Pointer mit malloc() oder (kürzlich gelesen) calloc() ein Speicherbereich belegt, kann solange free() nicht aufgerufen wird, nichts und niemand in den Bereich etwas schreiben, außer der angelegte Pointer selbst.
Möchte man für einen anderen Pointer ebenso etwas Speicher reservieren, muss dieser Pointer sich woanders umschauen. Findet er keinen Platz mehr, bekommt dieser Pointer die Speicheradresse 0 (ungültig) zugewiesen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4191
Erhaltene Danke: 831


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 23.08.17 13:44 
Zitat:
meine ausstehende Parkplatz-Metapher ruiniert. :crying:


Mich würde die Story interessieren.

Für diesen Beitrag haben gedankt: tomycat
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 23.08.17 13:56 
Kurfassung: Der TE (Pointer) ist ein Premium Mitglied eines Golfklubs, daher darf er sich auch einen Parkplatz (Speicherbereich) in der Nähe des Grüns reservieren. Er nutzt die Gelegenheit und parkt abwechselnd mit seinem roten Sportflitzer, ein ander Mal mit der Familienkutsche, und gelegentlich mit Omas alten Käfer (Wertzuweisungen) drauf. Andere Kunden dürfen das nicht, denn der Parkplatz läuft solange unter seinen Namen, bis er Mitgliedschaft kündigt (free aufruft).

Das ging anfangs etwas länger, und dann habe ich es wieder gelöscht, als ich deine Nachricht sah. :D

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 376
Erhaltene Danke: 48



BeitragVerfasst: Mi 23.08.17 17:09 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
malloc() und free() haben in der Sprache C ihre Berechtigung. Mit C++ kam das new hinzu, was genauso viel bewirkt wie malloc().


Das ist natürlich Unsinn nicht ganz richtig, denn new alloziiert keinen definierten Speicher, sondern erzeugt eine neue Instanz einer Klasse (inkl. Konstruktoraufruf, sofern vorhanden). malloc() schiebt erst mal einen bestimmten Speicherbereich frei, den du dann mit irgendwas - nicht zwangsläufig mit einer Klasseninstanz, sondern z.B. auch mit einem char* - vollschreiben kannst. Das geht auch in C++ noch. ;)

Für diesen Beitrag haben gedankt: tomycat
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mi 23.08.17 18:08 
Dazu bedarf es keinerlei Klasseninstanzen, und natürlich kann man in C++ auch malloc() anwenden, nur wozu?

ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
char* cNeu = new char[3];   // so unsinnig ist das garnicht
cNeu = "Neu";
printf("%s", cNeu);
delete(cNeu);
// eventuell noch NULL setzen

char* cAlt = (char*)malloc(3 * sizeof(char));  
cAlt = "Alt";
printf("%s", cAlt);
free(cAlt);

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3608
Erhaltene Danke: 719

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Mi 23.08.17 18:38 
Sorry Frühlingsrolle, aber dein Code ist falsch (UB).

Für diesen Beitrag haben gedankt: tomycat
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 376
Erhaltene Danke: 48



BeitragVerfasst: Mi 23.08.17 18:41 
Und zu umständlich. Wenn sizeof(char) jemals nicht 1 sein sollte, ist dein Compiler mit absoluter Sicherheit kaputt.

Für diesen Beitrag haben gedankt: tomycat
tomycat Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162
Erhaltene Danke: 1



BeitragVerfasst: Do 24.08.17 06:41 
ok danke Jungs,
kann man jemand ein Beispiel machen, wo man sagt HIER braucht man malloc und so stützt das Prog ab.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 3608
Erhaltene Danke: 719

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 24.08.17 08:26 
Lies dir am besten mal Dynamischer Speicher (bzw. der englische Artikel dazu: C dynamic memory allocation) und für C++ Speicherverwaltung / Zusammenfassung durch.

Für diesen Beitrag haben gedankt: tomycat
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 376
Erhaltene Danke: 48



BeitragVerfasst: Do 24.08.17 08:27 
Du brauchst malloc/calloc beziehungsweise realloc zum Beispiel für C und damit auch die Interaktion mit C.

Konkreter Anwendungsfall: du möchtest eine Textdatei zeilenweise in eine Variable speichern. Da C keine std::strings und keine Vektoren kennt, bräuchtest du dafür zum Beispiel einen char**-Pointer. Die einzelnen Strings brauchen aber jedes Mal eine andere Anzahl an Byte, sie sind ja selten identisch.

ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
/* Annahme: char* textfile enthält Textdatei */
while (textfile) {
    char* next_line = strchr(textfile, '\n');
    int linelength = next_line ? (next_line - textfile) : strlen(textfile); /* berechne Zeilenlänge */
    char* temp_str = (char *)malloc(linelength + 1); /* alloziere genau so viel Speicher (plus Nullterminator)! */

    if (temp_str) {
        memcpy(temp_str, textfile, linelength);
        temp_str[linelength] = '\0';
        /* temp_str = aktuelle Zeile */
        /* mach irgendwas damit */
        free(temp_str);
    }

    textfile = next_line ? (next_line + 1) : NULL;
}


Absturz (Beispiel): Räume einen Speicherbereich frei, der dir nicht gehört.

ausblenden C++-Quelltext
1:
2:
int quux = 42;
free(quux); /* peng */

Für diesen Beitrag haben gedankt: tomycat
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 24.08.17 08:48 
Entschuldigt, aber was ist an dem Code jetzt falsch? Wiki schreibt zu C++ :
ausblenden C++-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
int* val = new int;   // Speicheranforderung

    *val = 42;   // eine einfache Zuweisung

    cout << *val << endl;   // Ausgabe des Objekts

    delete val;   // Freigabe des Speichers

// auskommentiert, doppeltes Löschen führt zum Programmabsturz

//  delete val;

Zur Ausgabe habe ich printf() verwendet. Gut, delete() hätte ich auskommentieren sollen. Hab ich vorher nicht getestet.

Ihr wollt mir doch nicht weiss machen, dass man malloc() anders verfahrt, also so:
ausblenden C++-Quelltext
1:
char* cAlt = (char*)malloc(3 * sizeof(char));					

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 376
Erhaltene Danke: 48



BeitragVerfasst: Do 24.08.17 08:53 
Es ergibt nicht viel Sinn, hier einen Pointer zu verwenden. Aber warum sollte der Code falsch sein?

Nachtrag: Warum printf?

Für diesen Beitrag haben gedankt: tomycat
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1836
Erhaltene Danke: 333

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 24.08.17 09:07 
Warum, weil es ein Pointer auf char ist? Die Art der Ausgabe ist doch egal. printf() ist ein nützliches Ding, das nach belieben formatieren kann. Ich nutze es nunmal gern.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: tomycat
hydemarie
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 376
Erhaltene Danke: 48



BeitragVerfasst: Do 24.08.17 09:12 
Nö, ich meinte das Beispiel aus Wikibooks.

Für diesen Beitrag haben gedankt: tomycat