Nach Referenzieren der folgenden Ressourcen: here und here. So kann ich sehen, wie der richtige Weg dazu ist. Dann nach dem Lesen Beitrag, kann ich sehen, dass meine vorherige Warnung wurde behoben, indem ein typechar von char* "mystring"
in das Argument einer Funktion übergeben wird.C++ - Übergeben Char * durch Funktion Speicherfreigabe Fehler
Allerdings bekomme ich immer noch einen Fehler für eine ziemlich intuitive paar Zeilen Code (obwohl ich nicht C++ in irgendeiner Art berührt habe, daher, warum ich einige Probleme habe).
TextDocument.h
#ifndef ____TextDocument__
#define ____TextDocument__
#include <stdio.h>
class TextDocument {
char *text;
char *docName;
public:
void SetText(char *otherText);
char *GetText();
void SetDocName(char *newName);
char *GetDocName();
int GetTextLength();
};
#endif /* defined(____TextDocument__) */
TextDocument.cpp
#include <iostream>
#include "TextDocument.h"
#include "string.h"
using namespace std;
void TextDocument::SetText(char *otherText){
cout << otherText << endl;
if (text != 0)
delete text; //free the memory
text = new char[strlen(otherText)+1]; // +1 for the null char
strcpy(text, otherText); //text <- otherText
}
char *TextDocument::GetText(){
return text;
}
void TextDocument::SetDocName(char *name){
if (docName != 0)
delete docName;
docName = new char[strlen(name) + 1]; // +1 for the \0 terminator
strcpy(docName, name); // docName <- name
}
char *TextDocument::GetDocName(){
return docName;
}
int TextDocument::GetTextLength(){
if (text != 0) {
return strlen(text);
}
else return 0;
}
main.cpp
#include <iostream>
#include "string.h"
#include "TextDocument.h"
#include "Folder.h"
using namespace std;
int main(void){
TextDocument *sampleDoc;
sampleDoc = new TextDocument;
sampleDoc->SetText((char *)"some str"); // I have no idea why there is a linker error here.
return 0;
}
run.sh
g++ *.cpp -o main
./main
Ausgabe:
Blakes-MacBook-Pro:data_encapsulation bmc$ sh run.sh
some str
main(848,0x7fff7f54b300) malloc: *** error for object 0x8000000000000000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
run.sh: line 2: 848 Abort trap: 6 ./main
Problem 1
Warum ist es nicht mein char * Text zu löschen, wenn es uncreated ist.
Problem 2 (Sidebar Problem, nicht die sofortige Ausgabe)
Wo ist der beste Platz für alle, die H-Dateien zu setzen? Beispiel) Ich brauche #include <iostream>
und using namespace std
innerhalb von ein paar verschiedenen .h oder .cpp Dateien, wo wäre der beste Ort, um sie zu setzen; Wenn Sie sie nur in den Hauptteil stellen, werden diese anderen Module nicht in der Lage sein, es zu sehen und Fehler zu ergeben.
1. Fix Submission
So, nachdem einige mehr mit dieser Sache Verschrauben, habe ich den Fehler mit zu gehen weg von der Linie von
Ändernif (text != 0)
delete text; //free the memory
zu
if (text)
delete text; //free the memory
Ich denke, Ich verstehe die Logik if (thestringeisntempty) delete text;
aber warum funktioniert if(text != 0) delete text;
nicht auch?
Ihr Problem verwendet nicht std :: string, sondern die sehr unrecommended new und löschen. –
Setzen Sie im Konstruktor von TextDocument Text auf 'NULL' (oder' nullptr')? EDIT: vergiss, es gibt keinen Konstruktor. –
@The Techel, so verwenden Sie einfach ein 'std :: string' Datenelement und dann nur seinen Wert dort zurückgesetzt? Ich versuche, Best Practices zu lernen. – bmc