Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » delete verursacht Absturz?

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 < [ 2 ]
000
06.12.2003, 21:02 Uhr
~newbie
Gast


Warum stürzt dieses Programm bei mir bei "delete progname;" ab?


C++:
#include <stdlib.h>
#include <string.h>    // für strcpy
#include <stdio.h>    // für printf

void main()
{
    char *progname;

    progname = new char;

    strcpy(progname,"dynamische Speicherreservierung von Strings");

    printf("%s",progname);

    delete progname;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2003, 21:28 Uhr
ao

(Operator)


In der new-Zeile holst du dir Speicher für 1 Zeichen. An diesen Platz kopierst du dann einen ganzen Satz. Es ist blanker Zufall, dass es nicht schon hier kracht.

Besser gehts so:

C++:
progname = new char [1024]; // oder ne andere Laenge, jedenfalls genug!
// ....
delete [] progname;



ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2003, 22:28 Uhr
Pablo
Supertux
(Operator)


Ne komische Mischung aus C und C++. Ich habe ein Paar unangenehme Erfahrungen gemacht. Deshlab mein Rat: Mische C und C++ nicht.
1. main Funktionist nach ANSI int und nicht void
2. Wenn du schon alles mit den Standard C Librerien wie stdio.h, stdlib.h string.h und Sachen wie printf, strcpy, u.a. benutzt, wieso nicht gleich alles C? Und das heißt, malloc und free statt new und delete? Wenn du aber diese Liberieren unter C++ benutzen willst, solltest du besser #include <cstdio>, #include <cstdlib> einfügen. Nur mein Rat.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.12.2003, 22:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Ne komische Mischung aus C und C++. Ich habe ein Paar unangenehme Erfahrungen gemacht. Deshlab mein Rat: Mische C und C++ nicht.


hmm also ich mach das ständig. Ausser beim "malloc und new-mischen" (was man ja auch nicht machen soll)ist bei mir noch nie ein Problem aufgetaucht.
Was gibts den sonst noch so zu beachten von dem ich noch nichts weiss
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
06.12.2003, 22:34 Uhr
Pablo
Supertux
(Operator)


Ich habe schon einige Probleme gekriegt, komische Werte in den Variablen oder plötzliche "Sementation faults" bekommen, und seitdem ich nur C programmieren habe ich solche Probleme nie mehr gehabt. Deshlab sage ich das.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
06.12.2003, 22:43 Uhr
~newbie
Gast


danke für die Hilfe ...
ein Frage habe ich aber noch:
wenn ich das so...

C++:
progname = new char [1024];

...schreibe -

Wenn ich jetzt nur z.B. 50 dieser 1024 (bzw. 1023 wenn man das Stoppbit wegrechnet) verwende - werden dann auch nur 50 bytes im Speicher verwendet?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.12.2003, 23:00 Uhr
Pablo
Supertux
(Operator)


Nein, alle! Was ich nicht weiß, was in den restlichen Bytes steht, vielleicht Müll. oder wenn du etwas mit einem kleinern Text überschreibst, enthlaten sie die Zeichen der alten Zeichenfolge. \0 sorgt nur dafür, dass Funktionen für printf usw. erkennen können, wann die Zeichenkette fertig ist. Probiere mal folgendes:


C++:
#include <stdio.h>
#include <string.h>
int main()
{
    int i;
    char x[10];
    strcpy(x, "012345678");
    printf("%s\n",x);
    x[5]=0; // ist gleich wie ='\0';
    printf("%s\n",x);
    for(i=0;i<10; ++i)
        printf("%c, ", x[i]);
    printf("\b \n");
    return 0;
}



Ich habe so on the fly gemacht, noch nicht getestet, ich würde sagen, du bekommst:

Code:
012345678
01234
0,1, 2, 3, 4, , 6, 7, 8, ,




Bearbeitung von Pablo:

Ganz genau, wa sich mir vorgestellt habe. Ich habe schon getestet und bekomme beim Ausführen:

Code:
012345678
01234
0, 1, 2, 3, 4, , 6, 7, 8, ,




--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 06.12.2003 um 23:08 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.12.2003, 15:09 Uhr
~newbie
Gast


Hmm - wenn dann wieder 1024 bytes verwendet werden kann ich doch gleich alles ohne new schreiben!
Geht das nicht irgendwie so, das nur die tatsächliche Stringlänge verwendet wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
07.12.2003, 19:35 Uhr
Pablo
Supertux
(Operator)


Hmmm - ich habe deinen ersten Satz gar nicht verstanden Ich hab im Prinzip deine Frage nicht verstanden.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
07.12.2003, 19:45 Uhr
~newbie
Gast


Ich will das mein Programm 50 Bytes Speicher reserviert wenn ich der String 50 Bytes lang ist ... und 37 Bytes wenn der String 37 Bytes lang ist ...
also dynamische Speicherreservierung ...

Der String soll nur so viel Speicher verbrauchen, wie er lang ist (unter Berücksichtigung des Stoppbytes natürlich)

Kann es sein das man dazu einen Doppelpointer braucht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: