C++中使用new来动态分配内存的疑问
在C++中存在使用动态new来分配内存,然后使用delete来释放空间,但是我现在遇到一个疑问是:当我使用了在一个函数中使用new来动态分配了一个空间后,我没用delete来释放,那当这个函数调用结束后,我所创建的那个指针所指向的内容是否是一个垃圾值:
char * getname() // return pointer to new string
{
char temp[80]; // 字符数组
cout << "Enter last name: ";
cin >> temp;
char * pn = new char[strlen(temp) + 1];//动态创建一个数组
strcpy(pn, temp); // copy string into smaller space
return pn; //(1)当这个函数被调用完毕后,该pn所指向的值是否是一个垃圾值(不一定指向原先的值)
//(2)还有就是函数在return 回一个指针时,始终都没有使用delete来释放所分配的内存,那该pn是否会一直占用?
}
求各位大侠指点解析!谢谢 c++ delete new
[解决办法]
1 pn是个临时变量,函数调用完毕,它就不存在了,没有pn这个符号了,但他的值也就是堆中那块儿内存的首地址不是作为返回值了嘛。
2 是的,直到delete或者该进程退出
[解决办法]
1、返回后,pn指向的值就是strcpy后的值,不会变成垃圾值。
2、pn指向的内存一直没被释放,这是肯定的。
对于1问,看了你附加的“(不一定指向原先的值)”,是不是想说,第二次调用这个函数时,pn是不是指向原来的地址?如果是这样,只能告诉你:不会指向原来的地址,而是新 new 到的地址。
[解决办法]
把new和delete象fopen和fclose那样用。
[解决办法]
什么是指针?就是分配一块内存,把内存地址赋值给一个变量,这个变量就是指针。比如char *ptr = new char[10];ptr中存的就是new出来的内存地址,因为new出来的空间在堆上,所以即使函数执行完毕,也不会自动释放。而char *ptr是在函数栈中存在的,所以函数执行完毕ptr就获得不到了,从而导致new出来的内存地址丢失,所以你无法释放,只要你想办法保存这个地址,到哪里都能够释放的。
[解决办法]
char * pn = new char[strlen(temp) + 1];//动态创建一个数组
首先明确程序内存的分区问题,否则指针与内存的申请与释放就闹不明白。pn是一个函数局部变量,只不过这个变量特殊一些是一个指针变量,他是存储在栈中的,也有称作是堆栈的。new操作符时向堆区申请一块大小合适的空间并返回其首地址,这个地址用pn接受的。
return pn;
这是函数中返回一个指向堆区内存的指针,是合法的,也是不会带来隐患的。要明确的是pn作为一个函数局部变量且是non-static的,函数调用结束,也就是return语句执行完毕后pn就被自动销毁了(仅仅是变量销毁,不会影响到其所指向的堆区内存)。这时在函数的调用处会有一个变量来接受返回值的,所以返回出来的地址是可用的合法的。后面至于是否对内存delete要看你的需求了。
pn的生命周期仅仅是在函数调用的过程中(过程再细化一下:在函数的参数列表赋值完成后,进入函数体那一刻开始,到return语句执行完毕,到函数体的末尾一刻结束)
[解决办法]
关于程序的内存分区建议去看看这篇博客,我收藏的,很棒的一篇:http://www.cnblogs.com/JCSU/articles/1051579.html
我博客里也有类似的,有时间可以去看看
[解决办法]
char * getname() // return pointer to new string
{
char temp[80]; // 字符数组
cout << "Enter last name: ";
cin >> temp;
char * pn = new char[strlen(temp) + 1];//动态创建一个数组
strcpy(pn, temp); // copy string into smaller space
return pn;
//(1)当这个函数被调用完毕后,该pn所指向的值是否是一个垃圾值(不一定指向原先的值)
// 1) 这个指针一直在你的掌握之中,没有什么问题,
//(2)还有就是函数在return 回一个指针时,始终都没有使用delete来释放所分配的内存,那该pn是否会一直占用?
// 2)这里才是问题所在,如果没有 delete 就会一直占用,这就是所谓的memory leak内存泄露;
}
解决方法
用string代替
或者定义一个类
class name
{
public:
name():strname(NULL){}
static name getname() {
name newname;
char temp[80]; // 字符数组
cout << "Enter last name: ";
cin >> temp;
newname. newname= new char[strlen(temp) + 1];//动态创建一个数组
strcpy(pn, temp); // copy string into smaller space
return newname;
}
~name(){delete []strname;}
private:
char *strname;
}
[解决办法]
解决方法
用string代替
或者定义一个类
class name
{
public:
name():strname(NULL){}
static name getname() {
name newname;
char temp[80]; // 字符数组
cout << "Enter last name: ";
cin >> temp;
newname. newname= new char[strlen(temp) + 1];//动态创建一个数组
strcpy(pn, temp); // copy string into smaller space
return newname;
}
const char *c_str()const{return strname;};
~name(){delete []strname;}
private:
char *strname;
}