动态内存的传递

本文分析了C++中动态内存分配的常见错误,包括函数间动态内存传递的问题及内存泄漏的风险。

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

先看如下一段代码:

#include <iostream>
using namespace std ;

void Getmemory(char* p ,int num)
{
	p = (char*)malloc(sizeof(char)*num) ;
}

int main()
{
	char *str = NULL ;

	Getmemory(str,10) ;
	strcpy(str,"hello") ;

	return 0 ;
}

        上述代码中,Getmemory函数是有问题的,Getmemory函数体内的p实际上是main函数中的str变量在Getmemory函数栈中的一个备份,因为编译器总是为函数的每个参数制作临时的变量。因此虽然在代码第6行中p申请了堆内存,但是返回到main函数时,str还是Null,并不指向那块内存,所以代码第14行调用strcpy时会导致程序崩溃。

        实际上,Getmemory并不能做任何有用的事情,这里还要注意,由于从Getmemory函数返回时不能获得堆中内存的地址,那块堆内存就不能被继续引用,也就得不到释放,因此调用一次Getmemory函数就会产生num字节的内存泄漏。


可以试着先分析下面两个代码段的输出(动态内存的传递)

程序1:

char * Getmemory()
{
	char p[] = "hello world" ;
	return p ;
}

void test(void)
{
	char *str = NULL ;
	str = Getmemory() ;
	printf(str) ;
}

程序2:

void  Getmemory(char *p)
{
	p = (char *)malloc(100) ;
}

void test(void)
{
	char *str = NULL ;
	Getmemory(str) ;
	strcpy(str,"hello world") ;
	printf(str) ;
}
       程序1的Getmemory()返回的是指向栈内存的指针,该指针的地址不是NULL,但是当栈退出后,内容不定,有可能会输出乱码。

      程序2的Getmemory()没有返回值,这个函数不能传递动态内存。在test函数中,str变量的值通过参数传值得方式赋给Getmemory()的局部变量p。但是test()中的str一直未NULL,所以第10行中的调用会使程序崩溃。此外,由于堆内存在Getmemory()执行之后没有指针引用它,因此会产生内存泄漏。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值