Dyn Speicherallokation mit String
-
Hi,
ich habe eine Klasse wie folgt definiert:
#include <iostream>
using namespace std;class MString {
public:
MString::MString(unsigned = 0); //Konstruktor 1
MString::MString(char* = NULL); //Konstruktor 2
MString::MString(const MString&); //Copy Konstruktor
~MString(); //Destruktorvoid conOut(void) const { cout<<"Zeichenkette: "<<cp<<"\n"; };
unsigned length(void) const { return len; };
unsigned capacity(void) const { return maxlen; };private:
unsigned len;
unsigned maxlen;
char* cp;
};Meine Funktionsdefinitionen sehen so aus:
#include <iostream>
#include "MSTRING.h"
#include "handle.h"
#include <String.h>using namespace std;
MString::MString(unsigned laenge) { //Konstruktor 1
len = laenge;
maxlen = len;
cp = new char(len);
}MString::MString(char* p) { //Konstruktor 2
//Länge des C-Strings ermitteln
len = strlen(p);//Länge des Speichers
maxlen = len;//Speicher allokieren
cp = new char(len);//String kopieren
cp = strncpy(cp,p,len);}
MString::MString(const MString& a) { //Copy Konstruktor
int i;
//Längen kopieren
len = a.len;
maxlen = a.maxlen;//Neue Allokation für String
cp = new char(len);//String kopieren
i = len;
while(i >= 0) {
*(cp + i) = *(a.cp + i);
i--;
}
}MString::~MString() { //Destruktor
//Speicherplatz freigeben
delete[] cp;
}Nun kriege ich folgenden Fehler:
DEBUG ERROR !
DAMAGE:after Normal Block (#54) at .....Bin ziemlich ratlos.
Grüsse
Matthias
-
Hallo
Ist vielleicht ein blöder Tipp, aber benutz einfach std::string.
chrische
-
Sorry aber das kenn ich nicht, muss etwas mit dem Copy Konstruktor zu tun haben
-
benutze cp = new char[len]
also mit ECKIGEN Klammern und nicht mit runden.
keine Ahnung wieso es abschmiert, und wieso der Compiler das auch annimmt.
Ich kenne es nur mit eckigen, und das funktioniert.mfg
-
std::string ist die string klasse der C++ std-lib.
genau genommen ist std::string ein typedef für std::basic_string<char>.
wenn du strings haben willst dann nimm std::string da dann jeder ohne proleme dene source erwenden könnte, was wichitg ist wenn du im team arbeitest oder deine source verüffentlichst.
Es ist ein tipp vieler erfahrenne C++progger
(zu denen ich NICHT gehöre)
"schreibe NIE etwas neu, was es schon in der C++ STD-lib gibt."Mfg Shade37337
-
Die String Klasse der STL ist IMHO aber nciht sooo dolle.
Und außerdem ist sie auch ein gutes Übungsbeispiel, da kann man ne Menge mit
dynamische Speicherverwaltung lernen.
-
Ok mit den eckigen Klammern geht es, aber er allokiert mehr als ich will ich geb ihm jetzt
MString::MString(char* p) { //Konstruktor 2
//Länge des C-Strings ermitteln
len = strlen(p);//Länge des Speichers
maxlen = len;//Speicher allokieren
cp = new char[len];//String kopieren
strncpy(cp,p,len);}
Die genaue Länge vor und er macht so ca 6 Plätze mehr als len vorgibt ?
Grübel Grübel HÄÄÄÄ
-
Ich nehme mal an, du ahst es beim debuggen im Speicherabbild gesehen das er mehr Speicher reserviert.
Das habe ich auch schon bemerkt, aber ich vermute dsa da noch ein paar verwaltungsinformationen reingeschrieben werden. Wenn du nämlich jetzt über dein Array hinausschreibst, stürzt es beim delete[] ab. Deswegen denke ich sind das Verwaltungsinfos.
-
im übrigen ist mir gerade noch aufegefallen, das du deine Strings ohne Nullterminierung kopierst wenn das so gewollt ist dann okay. Aber deine conOut Funktion wird so nicht funktionieren, wenn ich das jetzt richitg überblickt habe.
-
Doch sie funkt, das ist die Aufgabe dieses Praktikums, keine C-Strings mit /0 sondern allokieren und kopieren jedoch nicht abschliessen. Die conOut funkt, jedoch mit einigen nachfolgenden Zeichen, das soll aber angeblich so sein, dämliche Aufgabe der Uni.
Ich glaub das passt jetzt so, vielen Dank für deine Hilfe, die Lösung waren die eckigen Klammern.
-
jo genau das meinte ich mit nicht funktionieren, cout gibt halt solange aus bis eine 0 im Speicher steht. Aber wenn das die aufgabe ist, dann passt das schon