Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » dynamische Speicherverwaltung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.01.2007, 21:45 Uhr
KaraHead



Moin, ich hab mal ein paar Fragen, die ich einfach mal in den Thread schmeiße


C++:
int *ptr1 = (int*)calloc(3,sizeof(int));
int *ptr2 = (int*)calloc(4,sizeof(int));

//arbeite mit ptr1 ...

ptr1 = (int*)realloc(ptr2,4*sizeof(int)); // (1)

//oder
ptr1 = (int*)malloc(sizeof(int)); //(2)



Muss ich bei (1) oder (2) den ptr1 erst mit free() freigeben und auf NULL setzten, bevor ich ihn wieder neu belege oder räumt das System den Speicher auf den kein Pointer mehr zeigt selber frei (scheint für mich eher unwahrscheinlich, da es sich nach GC anhört)?

Und die 2. Frage

C++:
int *ptr1 = (int*)calloc(2,sizeof(int));
int arr[10];

//Fülle arr


ptr1 = (int*)realloc(arr,10*(sizeof(int)); //(1)



(1) sollte doch eigentlich auch funktionieren, da Arrays auch in einen Pointer umgewandelt werden können, nicht oder?

In meinem (kleinen) Programm wurde ptr1 zwar gefüllt aber nicht mit dem Inhalt von arr, sondern mit sinnlosen Zeichen/Zahlen.

Danke schonmal.

Dieser Post wurde am 10.01.2007 um 21:46 Uhr von KaraHead editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.01.2007, 22:04 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi, realloc auf objekte auf dem stack anzuwenden dürfte dir um die ohren fliegen.

ansonsten:


C++:
int *ptr = (int*)calloc(2, sizeof(int));

int *t = realloc(ptr, 10*sizeof(int));
if(!t) // ptr ist unverändert!
{
  perror("realloc failed");
  exit(1);
}

// ok realloc hat geklappt, daten werden automatisch kopiert, restlichen elemente sind aber uninitalisiert!
ptr = t;

// also ggf:
memset(&ptr[2], 0, sizeof(int)*8);


--
class God : public ChuckNorris { };

Dieser Post wurde am 10.01.2007 um 22:04 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.01.2007, 00:00 Uhr
Blubber2063



Und ums noch mal direkt zu sagen, das System räumt dir den Speicher nur hinterher, wenn du das Programm beendest, sonst musst du dich selbst drum kümmern. Das mit dem Null setzen ist deine Entscheidung, aber freigeben musst du den anderen Speicherbereich, denn du änderst ja nur den Pointer der vorher auf nen allocierten Bereich gezeigt hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.01.2007, 10:02 Uhr
Pler
Einer von Vielen
(Operator)


Ist es eigentlich leichter also Java-Programmierer C/C++ zu lernen, oder also C/C++ler Java?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.01.2007, 11:29 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


C/C++ als Java ist schwieriger, aber dein Code ist schön strukturiert
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.01.2007, 18:29 Uhr
KaraHead



Ok, bei Flosofts Post versteh ich nur, dass es unklug ist Sachen vom Stack in einen Pointer zu kopieren. Das Beispiel raff ich net so ganz.

@Blubber2063
muss ich auch den Speicher bei realloc vorher räumen oder wird der vorhanden Speicher einfach erweitert und weiter benutzt?

Danke schonmal

Dieser Post wurde am 11.01.2007 um 18:30 Uhr von KaraHead editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
11.01.2007, 18:39 Uhr
Blubber2063



Realloc tut folgendes, er nimmt sich den Zeiger den du übergibst, falls er den Speicher vergrößern kann tut er es, falls nicht holt er sich neuen Speicher der groß genug ist, kopiert dann den Inhalt des alten Speicherbereichs in den neuen gibt den alten Speicherbereich frei und gibt dir den Zeiger auf den neuen Speicherbereich wieder.

Es geht hier nicht um das kopieren in einen Pointer. Was Flosoft meint ist, du kannst nicht Stackspeicher an Realloc geben, das wird vermutlich nen Laufzeitfehler geben, wenn er versucht den Stackspeicher freizugeben, denn vergößern kann er ihn ja auch schlecht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
11.01.2007, 18:43 Uhr
KaraHead



So nun hab ichs, danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: