c++ 堆内存和栈内存的使用

本文探讨了C++中内存管理的问题,特别是针对new和delete操作符的使用,通过具体实例讲解了如何正确地处理堆内存分配与释放,以及成员变量指针的管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值