Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Anonymous

unregistriert

11

03.03.2004, 19:47

Habs eben nochmal ausgetestet, egal wie ich es mache, der Fehler taucht immer dann auf wenn die Zeile

delete pStringData;

ausgeführt werden soll.


Ich hoffe wirklich, irgendjemand hat hier noch eine Idee, die mir helfen könnte.

Vielen Dank

Timo

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

12

03.03.2004, 19:57

Timo, der Fehler kommt, weil Du das "+1" vergessen hast. Ausserdem darfst Du nicht sizeof benutzen, sondern strlen. Die Fehlermeldung sagt ja auch genau was passiert: Du schreibst hinter das Ende des von Dir (per new) allozierten Speichers.

Anonymous

unregistriert

13

03.03.2004, 23:53

Hallo Osram,

sorry ich hatte Dein Post da eben einfach übersehen, keine Ahnung wie das passieren konnte, war wohl schon zu spät :-)

Also ich habe es nun so abgeändert, jedoch erwartet strlen() nen "const char*" als Parameter, somit geht "strlen(*pStr)" nicht.

Mache ich es aber so: strlen(pStr), so stürtzt mein Programm wieder ab, diesmal mit einer Zugriffsverletzung / Lesefehler.

Ich hoffe du kannst mir (nochmals) weiterhelfen.


Gruß, Timo

Anonymous

unregistriert

14

04.03.2004, 00:00

Jetzt funktioniert es - ich musste die string.h einbinden, damit er den String ordentlich löschen konnte - kann mir jemand sagen, was string.h da für Wunder vollbringt? ;-)

Vielen Dank nochmal an alle für die Hilfe


Beste Grüsse,
Timo

15

04.03.2004, 00:52

Die string.h bewirkt keine Wunder. Es liegt wohl eher an deinem Code. In der string.h sind nur die String-Operationen Deklariert, sonst nichts. Vieleicht hat dein Compiler auch nur bei deinen Änderungen nicht alles neu gemacht. Das kann schon mal vorkommen. Daran sind schon viele verzweifelt ;D

Noch ein Tipp zu deiner Klasse. Du solltest noch eine zusätzliche Member einbringen. Diese speichert dann die länge der Zeichenkette (mit oder ohne 0Byte).

Sachen wie diese sollte man nicht machen:

Quellcode

1
char* m_pcStr = new char[strlen("Hallo")];
Damit ist ein Fehler vorprogrammiert. Denn strlen liefert die länge des Strings und dazu gehört nicht das 0Byte.

@realloc:
Stimmt mit realloc kann man einen Speicherbereich in seiner Größe verändern. Allerdings sind new und realloc nicht Kompatible zu einander. Benutzt man beide in Kombination kann[/b es zu nicht Definierten Fehlferhalten kommen. Wenn man Speicher reservieren will, sollte man sich am besten immer entscheiden ob man die C++ Variante nimmt, oder halt die C Variante.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Till

Alter Hase

Beiträge: 378

Wohnort: Lincoln College, Oxford

Beruf: Student

  • Private Nachricht senden

16

05.03.2004, 16:24

@realloc:

Natürlich (vergaß ich zu schreiben) muss man die C-Variante zur Allozierung benutzen ( ... = (char*)alloc(X)) ).
Allerdings frage ich mich, ob es in den C++ Standartbibliotheken auch etwas "realloc-Ähnliches" gibt, das kompatibel zu "new" ist...

In Deinem Beitrag befinden sich noch Fehler.
Bitte bearbeite die rot markierten Stellen und lösche diesen Text.
DOMINVS ILLVMINATIO MEA
---
Es lebe unmanaged Code!
---
>> Meine Uni <<

17

05.03.2004, 17:03

Keine Ahnung. Gefunden hab ich bis jetzt jedenfalls noch nichts. Solange man eine Kombination auf die Std. Typen (char, int, etc.) beschränkt, sollte nichts weiter passieren. Nur sobald man mit Klassen arbeitet, dürfte es Probleme geben.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Anonymous

unregistriert

18

07.03.2004, 19:16

Quellcode

1
Noch ein Tipp zu deiner Klasse. Du solltest noch eine zusätzliche Member einbringen. Diese speichert dann die länge der Zeichenkette (mit oder ohne 0Byte).


Danke DragonMaster, den Tip werde ich gerne befolgen.


Gruß, Timo

Samuel G.

Treue Seele

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

19

30.04.2004, 11:22

Noch n Tipp

Hallo

Bei klassen, deren Hauptmember man wahlweise setzen kann, und die dann dynamisch Speicher reserwieren lohnt es sich (vor allem wenn die Klasen größer und unübersichtlicher werden) einige allgemeine Definitionen einzuhalten.

1. zeigt ein Pointer auf Mist, sollte man ihn auf NULL setzen (z. B. nach dem Löschen mit delete oder delete[])

2. wird für nen Pointer (z. B. mit new) Speicher angefordert so sollte man immer prüfen, ob der Zeiger auch NULL ist. Ist er es nicht, so sollte man ihn zuerst löschen, oder ne Fehlermeldung ausgeben (es gibt Fälle, in denen das logisch sinnvoll wäre).

Dadurch erübrigt sich die Verwendung von new char[0] im Konstruktor. Du setzt das Feld erst mal NULL.

PS: ich würd nur Speicher für das char array reservieren, wenn das notwendig ist, und nur soviel wie notwendig ist.

Samuel G.
Quak

Jumping Jack

Treue Seele

Beiträge: 142

Wohnort: Hamburg

Beruf: Schüler

  • Private Nachricht senden

20

30.04.2004, 12:45

Realloc:
realloc muss wahrscheinlich auch öfter einfach neuen speicher anlegen und den alten speicher hineinkopieren. Wenn allerdings hinter dem reservierten speicher noch genügen speicher frei ist, dann könnte realloc diesen zu vergrößerung nutzen(was natürlich deutlich schneller gehen würde).
Ich weiß nicht genau wie realloc funktioniert. Das hier sind also nur vermutungen.

Zu malloc und new:
Man kann afaik auch den speicher an sich mit malloc reservieren und dann mit placement new sein objekt darin platzieren. Wie man die objekte dann wieder zerstört weis ich nicht mehr genau, aber ich denke, dass man einfach nur den destructor aufrufen muss.

Werbeanzeige