我是一个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,这是我的想法如有错误的地方还请大家指正。