论CC++函数间动态内存的传递

论CC++函数间动态内存的传递,第1张

论CC++函数间动态内存的传递,第2张

说到C/C++的核心编程,你会没完没了地和内存管理打交道。这些往往让人痛苦。所以如果你想深入C/C++编程,一定要静下心来,过一段苦日子。

现在我们就来讨论一下C/C++中动态内存的调用,我觉得不是完全清楚。它也是语言中最详细的概念和最困难的技术之一。而很多专业人士在软件开发中是写不出相关的合格代码的。

【简介】看看下面的例子,这是我们在项目内部编写库函数或常用函数时经常希望的。

void MyFunc(char *pReturn,size _ t size)
{
…………
pReturn =(char *)malloc(sizeof(char)* num);
…………
}

我们可以清楚地看到代码编写人员的意图,他想在函数调用处声明一个指针。

char * pMyReturn = NULL

然后调用MyFunc进行处理,返回一个有大小的动态内存。

那么作者能达到预期的效果吗?

然后我可以告诉作者,他的程序很幸运地在编译时通过了,但是他的程序在运行时崩溃并终止了。

原因是他违反了系统的不可侵犯性:错误地操作内存。

【内存操作相关知识点及问题】为了彻底解决动态内存迁移的问题,我们先来复习一下内存管理的知识点。

(1)内存分配有三种方式:

从静态存储区分配。内存在程序编译时就已经分配好了,在程序的整个运行期内存都是存在的。比如全局变量,静态变量。

在堆栈上创建。函数执行时,可以在栈上创建函数中局部变量的存储单元,这些存储单元在函数执行结束时自动释放。堆栈内存分配内置在处理器的指令集中,效率非常高,但分配的内存容量有限。

从堆中分配,也称为动态内存分配。程序运行时,用malloc或new申请任意数量的内存,程序员负责什么时候用free或delete释放内存。动态内存的寿命是由我们决定的,它的使用非常灵活。

(2)指针的操作过程

并将应用程序初始化或设置为空:int * pint = null;

Open up 空或使其指向对象:pInt = new Int(3);或者int I = 3;pint = & I;

使用指针(更确切地说,操作内存,并添加if(pint!=NULL)或assert(品脱!=NULL)使用前,万一内存应用失败,使用指针):

如果(p!= NULL){使用品脱};

使用的内存。免费(品脱);

将指针设置为空pInt = NULL;(避免出现通配符指针)

(3)在函数的参数传递中,编译器总是会对函数的每个参数进行临时复制。如果参数是p,那么编译器会产生一个p _p的副本,这样_ p = p如果函数中的程序修改了_p的内容,参数p的内容也会相应修改。这就是指针可以用作输出参数的原因。

【问题分析】

根据以上规律,我们很容易分析出例题中失败的原因。

void MyFunc(char *pReturn,size _ t size)
{
…………
pReturn =(char *)malloc(sizeof(char)* num);
…………
}
void main(void){
char * pmy return = NULL;
MyFunc(pMyReturn,10);
}

在MyFunc(char *pReturn,size_t size)中,_pMyReturn真正申请的是内存,_pMyReturn申请的是新内存,只改变了_pMyReturn所指向的内存地址,而pMyReturn保持不变。所以函数MyFunc不能输出任何东西。事实上,每次执行MyFunc都会泄漏一个内存,因为free不是用来释放内存的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 论CC++函数间动态内存的传递

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情