c++ 堆記憶體和棧記憶體的使用
我是一個java程式設計師,在java幾乎沒有釋放記憶體的概念,轉到開發c++程式還有諸多不習慣,以下是我在專案的中遇到的一下問題,希望有大神能給正解
#pragma once #include "string" #include "iostream" using namespace std; class Person { private: string *name; string add; public: Person(void); ~Person(void); string* getName(); string getAdd(); void setName(string *name); string* getStatus(); };
#include "Person.h" Person::Person(void) { name = new string("xiaoming"); add = string("zhon yang da jie"); } Person::~Person(void) { cout<<"刪除"<<endl; delete name; } string* Person::getStatus() { string *sth = new string("do home work"); cout<<"函式內:"<<sth<<endl; return sth; } string* Person::getName() { return this->name; } std::string Person::getAdd() { return this->add; } void Person::setName(string *name) {if(name != NULL)delete this->name; this->name = name; } void main() { Person *p = new Person(); //(1) string sth = *p->getStatus(); cout<<sth<<endl; cout<<&sth<<endl; //(2) string *str = p->getStatus(); cout<<*str<<endl; cout<<"地址"<<str<<endl; delete str; str = p->getStatus(); cout<<*str<<endl; cout<<"地址"<<str<<endl; //(3) string *name = new string("xiao wang"); p->setName(str); //delete name; cout<<"name 地址"<<name<<endl; cout<<"p.name 地址"<<p->getName()<<endl; cout<<"p.anem 值:"<<*p->getName()<<endl; system("pause"); delete p; }
上述程式碼涉及到一個問題那個就是返回值的問題,第一個string sth = *p->getStatus(),p->getStatus(),返回的是一個string型別的指標此時用std來接收則是將堆記憶體的資料拷貝到棧記憶體中來,此時堆記憶體有“do home work”,這個對記憶體該如何刪除呢,於是我想到的(2)處解決方法。用一個指標接收然後刪除delete,這的確可以回收這個堆記憶體的空間。接著我發現了問題(3)這裡的問題是anme是這個指向堆記憶體的指標,它被用著引數傳遞到person中去,那這個記憶體該如何回收呢?我現在的想法是在p->setName()中先delete原來的堆記憶體,然後賦值,最後在這個類的解構函式中的delete 成員變數Name,這是我的想法如有錯誤的地方還請大家指正。