【高质量C++/C总结8】内存管理——指针参数传递内存

说在开始:

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

使用函数参数动态申请内存时易出现的问题

这里讲解一下网上常出现的GetMemory()方法,经常被作为考察C++功力的面试题。

//错误代码
void GetMemory(char *p) {
	p = (char*)malloc(sizeof(char) * 100);
}
int main() 
{
	char *str = NULL;
	GetMemory(str);
	strcpy_s(str,100, "Hello world ");//运行错误
	cout << str << endl;
	cin.get();
}

如上面的错误代码,在函数的参数为指针时,千万别使用该指针去申请动态内存。为什么会出现这个问题呢?

这就形参_p和实参p的问题了。编译器会对函数每个参数拷贝一个副本,也就是_p。这里是形参_p指向了新申请的动态内存,而实参p并没有指向内存,在方法GetMemory执行结束后,_p自动销毁,那么申请的内存就变成了垃圾内存,每运行一次GetMemory,就会泄漏一块内存。所以上面的代码是错误的。

可以改写成指针的指针来动态申请,如下。

//正确代码方式1——指针的指针
void GetMemory2(char **p) {
	*p = (char*)malloc(sizeof(char) * 100);
}
int main() 
{
	char *str = NULL;
	GetMemory2(&str);
	strcpy_s(str,100, "Hello world ");
	cout << str << endl;
	cin.get();
}

指针的指针有时理解起来会有困难,建议大家使用此种方案。

//正确方式2——返回值
char* GetMemory3() {
	char* p = (char*)malloc(sizeof(char) * 100);
	return p;
}
int main()
{
	char *str = NULL;
	str=GetMemory3();
	strcpy_s(str, 100, "Hello world ");
	cout << str << endl;
	cin.get();
}                                                                                                  ```

这里需要注意,千万不要在GetMemory方法中返回栈内存的内容。例如:

//错误示例
char* GetMemory() {
char[] p=“Hello”;
return p;
}
//存在问题的示例
char* GetMemory() {
char* p=“Hello”;
return p;
}


在第一个方法中字符数组在栈中,方法执行完后,自动释放,返回指针和引用都是无意义的。

第二个方法可以正确运行,但是不建议这样做。因为这里的Hello是一个常量字符串,在静态存储区,在程序生命期内始终存在,无论什么时候,返回的都是同一块内存的内容,最好不要修改该内存的内容,可以使用const进行修饰防止出现修改错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值