前言:
C++中经常会提到栈空间和堆空间,个人理解为,栈即客栈,为公家的东西,有其公共服务人员。堆即堆放,像自己的家,随便放东西,哪天实在看不下去了,就来个大扫除。
核心思想即:栈空间申请完由机器自动去释放;堆空间申请完需要自己(程序员)去释放。
案例一:野指针的产生
#include<iostream>
using namespace std;
/*函数声明*/
char * getdrink(void);
/*函数定义*/
char * getdrink()
{
char get_drink[30] = "ning xia gou qi!";
return get_drink;
}
/*主函数*/
int main()
{
char * drink;
drink = getdrink(); // 右边因为是栈空间,因此会自己释放内存,导致左边指针不能指向具体的地址,进而变为野指针
cout << "In the evening,I had " << drink << endl;
return 0;
}
解决方案:
#include<iostream>
#include<cstring>
using namespace std;
/*函数声明*/
char * getdrink(void);
#if 0
/*函数定义*/
char * getdrink()
{
/*C语言中使用字符数组来保存字符串*/
char get_drink[32] = "ning xia gou qi!";
/*申请一个堆内存空间*/
char * drink = new char[strlen(get_drink)+1];
/*内存copy*/
strcpy(drink, get_drink);
return drink;
}
int main()
{
char * drink;
drink = getdrink();
cout << "In the evening,I had " << drink << endl;
/*释放堆空间*/
delete [] drink;
return 0;
}
#else
char * getdrink()
{
/*C语言中使用字符数组来保存字符串*/
char get_drink[32] = "ning xia gou qi!";
/*分配一个堆内存空间*/
char * drink = (char*)malloc(strlen(get_drink)+1);
/*内存copy*/
strcpy(drink, get_drink);
return drink;
}
int main()
{
char * drink;
drink = getdrink();
cout << "In the evening,I had " << drink << endl;
/*内存释放*/
free(drink);
return 0;
}
#endif