指针动态申请内存的问题

今天腾讯一面,面试官让我做的题目里面,就有一道是使用指针做参数,动态申请内存的题目,我非常肯定地答了错误答案...

刚好看到有博客在说这个,马上转载下来

在《高质量C/C++编程》一书中,作者曾提出了“如果函数的参数是一个指针,不要指望用该指针去申请动态内存”,而我正犯了这个错误。下面将结合该书对此问题做深入分析,以此记录,避免以后再犯错。

       我们将上述问题抽象出来,如下代码:

#include <iostream>
using namespace std;
void func(int* t)
{
	t = new int;
}
int   main()
{
	int* test =NULL;
	func(test);
	delete test;
	system("pause");
	return   0;
} 

首先来分析下指针参数传递的原理。编译器总是要给每个函数参数创建一个临时副本,例如指针参数m的临时副本是_m,_m=m,此时_m和m指向同一段内存地址,如图1所示。因此,当我们修改地址1的内容时,实际也就修改了m所指向的内存的内容,这一点与我们平时使用指针参数的目的是一致的。然而,当我们修改_m的值(为其申请动态内存)时,只是将_m指向另一段内存地址(地址2),而m仍然指向地址1,这就相当于值传递了,是无法更改变量内容的。同时,这么做的话为造成内存泄露。


  如果需要通过指针参数来申请动态内存,有三种做法:

(1)使用指向指针的指针参数,即func(int** t)

void func(int** t)
{
        *t = new int;
}
int   main()
{
	int* test =NULL;
	func(&test);
	delete test;
	system("pause");
	return   0;
}

//(2)使用指针的引用,即func(int*& t)
void func(int* &t)
{
	t = new int;
}
int   main()
{
	int* test =NULL;
	func(test);
	delete test;
	system("pause");
	return   0;
} 
//(3)使用函数返回值来传递动态内存,即int* func()
int* func()
{
	int* t = new int;
	return t;
}
int   main()
{
	int* test =func();
	delete test;
	system("pause");
	return   0;
}

转自: http://blog.csdn.net/zwgdft/article/details/7454003


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值