1. 程式人生 > >c++如何傳遞動態記憶體

c++如何傳遞動態記憶體

先看一段程式碼:

#include<iostream>
using namespace std;
void GetMe(char *p,int num)
{
	p=(char*)malloc(sizeof(char)*num);
	
}
int main()
{
	char *str=NULL;
	GetMe(str,100);
	strcpy(str,"Hello!");
	cout<<str<<endl;
	return 0;
}

該程式碼執行崩潰,原因是str並沒有實際獲得指標p開闢的記憶體空間。在函式GetMe中,p實際上是主函式中str的一個副本,p申請了記憶體,只是把p指向的記憶體地址改變,而str並沒有改變,所以str依然沒有獲得記憶體,在執行字串複製時就會出錯。而且每次p申請的記憶體都不會得到釋放,最終會造成記憶體洩露。

我們可以更改以上程式碼如下:

#include<iostream>
using namespace std;
char* GetMe(char *p,int num)
{
	p=(char*)malloc(sizeof(char)*num);
	return p;
}
int main()
{
	char *str=NULL;
	str=GetMe(str,100);
	strcpy(str,"Hello!");
	cout<<str<<endl;
delete str;
	return 0;
}

在該程式碼中我們為p申請了空間,並將該空間的地址作為返回值傳給str,這樣str就指向了p申請的記憶體空間。還有一種修改方法是:傳遞str的指標:
#include<iostream>
using namespace std;
void GetMe(char **p,int num)
{
	*p=(char*)malloc(sizeof(char)*num);
	
}
int main()
{
	char *str=NULL;
	GetMe(&str,100);
	strcpy(str,"Hello!");
	cout<<str<<endl;
	delete str;
	return 0;
}

在該程式碼中傳遞了str的指標給函式GetMe(),那麼p就是str的地址的副本,地址的副本可定就是該地址了,所以該函式是為str地址指向的str開闢空間。所以能正確輸出結果。