C++, die dynamisch Speicher in einer Funktion - newbie-Frage
Bin ich der Untersuchung ein Speicherverlust und von dem, was ich sehe, das problem sieht so aus:
int main(){
char *cp = 0;
func(cp);
//code
delete[] cp;
}
void func(char *cp){
cp = new char[100];
}
In der //code, der Kommentar, die ich erwartet habe cp, um auf dem zugewiesenen Speicher, aber es ist immer noch eine null-Zeiger-Sinn, den ich nie löschen Sie den Speicher. Was mache ich wroing?
- Ich gehe davon aus
cbuf
war wohl zucp
? - wie etwa die Setzung echten code. Es sei denn, den code Ausschneiden und einfügen, es ist die posability von Ihnen das hinzufügen Fehler. Dies macht nur thigs härter und wir am Ende die Lösung Ausschneiden und paster Fehler wie cbuf -> cp
- Tut mir Leid, dass, ich werde ihn in Erinnerung behalten für das nächste mal. Ja cbuf sein sollte, war cp
Du musst angemeldet sein, um einen Kommentar abzugeben.
In dieser Funktion char *cp ist ein "Zeiger weitergegeben werden durch kopieren", was bedeutet, dass Sie auf den gleichen Speicher-Adresse, aber Sie sind nicht die gleichen Zeiger. Wenn Sie ändern Sie den Zeiger im inneren, so dass es zu Punkt woanders, die original-Zeiger übergeben wurde, wird zeigen immer wieder auf 0.
Zuweisung
cp
der Wert den zugewiesenen Speicher. Aber das ist eine variable auf dem stack: eine Kopie dercp
im main!cp
ist lokal zu der Funktion, die Sie in.Was Sie wollen, ist ein Verweis:
Wird dieser alias
cp
werden die parameter übergeben.Der parameter cp ist eine lokale variable der Funktion - ändern es ändert sich nicht alles, was außerhalb der Funktion. Eine bessere Art und Weise zu schreiben, die Funktion ist:
- Und zwar nicht direkt Ihre Frage, aber Sie sollten wahrscheinlich mit std::string und std::vector anstatt dynamisch zugewiesenen arrays.
Sind Sie vorbei in
cbuf
, nichtcp
.Die Funktion ist nur die änderung einer KOPIE
cp
. Verwenden Sie eine Referenz statt.Obwohl Verweise sind wunderbar in bietet eine intuitive Abstraktion, zusätzlich verstärkt durch die C++11-rvalue-Referenzen zu ermöglichen Funktion chaining (und andere esoterische Codierung), es fraglich ist, dass Sie bieten keine Sicherheit (namentlich warum ist ein Verweis als sicherer als ein Zeiger)
Es gibt Fälle, wo es besser ist, zu beheben, das oben mit einem Zeiger auf Zeiger Funktion argument.
Speziell, wenn es die Notwendigkeit zu pflegen eine ähnliche Codebasis in ansi c und c++.
Natürlich die Beseitigung von Speicher-Ressourcen aus dem Bereich der instatiating Funktion gehorcht RAII.
Als GMan und Neil erwähnt, um zu arbeiten, müssen Sie ändern func an:
char* func();
oder
void func(char*& p);
die Lösung Ihres Problems.
Ist, gibt es jedoch ein problem Wartung. In jedem Fall, func gibt einen Zeiger. Was ist nicht klar an die Benutzer von func ist, der zurückgegebene Zeiger wird gelöscht werden. Aus diesem Grund generell meiden dieses Konstrukt, es sei denn, 100% notwendig. Eher:
Also für C++ - code,die ich empfehlen würde:
Jedoch in der C-Programmierung vor allem, könnte es zu 100% notwendig, um irgendeine Art Funktion, um das array erstellen. Also in C-Programmierung können Sie ersetzen Sie den Destruktor mit einem
CreateCBuf
undDestroyCBuf
Funktion. Auf diese Weise werden die Benutzer der Bibliothek wissen, dass die Puffer zurückgegeben, muss zerstört werden.std::vector
?