C++ Prinmer plus 第5版 P106 程序清单4.22内存怎么释放,谢谢
RT
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
char * getname()
{
char temp[80];
cout << "Enter last name: ";
cin >> temp;
char *ps = new char[strlen(temp + 1)];
strcpy(ps,temp);
return ps;
}
int main()
{
char *name;
name = getname();
cout << name << " at " << (int *)name << "\n";
delete []name;//运行到这一行就停止了,而且内存好像也没释放掉,运行窗要强行才能关闭
name = getname();
cout << name << " at " << (int *)name << "\n";
delete []name;
return 0;
}
我在VS2010内跑的,但是不像书中那样可以安全释放内存
请问大家怎么看?
谢谢
[最优解释]
你这几条理论 多数程序员都懂的,但是我建议你不要纸上谈兵,自己亲自试试就知道结果了,楼主你可以试下他的方法。
//我的意思是:你用的是优化前的debug版本,如果用优化后的release版本就能正常结束。
[其他解释]
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
char * getname()
{
char temp[80];
cout << "Enter last name: ";
cin >> temp;
char *ps = new char[strlen(temp + 1)]; //new 是在 堆上分配一块内存,需要程序员使用delete[] 手动释放,程序员负责
strcpy(ps,temp);
return ps;
}
int main()
{
char *name;
name = getname();
cout << name << " at " << (int *)name << "\n";
delete []name;//第一次释放,释放时最好使用 name = null;
name = getname();
cout << name << " at " << (int *)name << "\n";
delete []name;//第二次释放,最使用时,最好先判断 if(name) name指向不为null
return 0;
}
[其他解释]
对一个可执行程序而言,所占用资源,
一是栈,这部分资源,就是函数内部
诸如 void test()
{
int a = 3; 这部分使用就是在栈上,栈上资源是系统负责释放的,程序员不能释放
}
二是 堆,就是系统准许我们自己申请系统资源,使用new alloc malloc.此时申请的资源,如
char *pstr = new char[200]; //我们调用 new时,就会在堆里申请200个 char的空间,此时系统给我们的权限是,能够申请,但是他把释放的权利也给我们了,它就不管了。如果你不释放,不好意思,只有我们的程序退出时,系统因为释放了进程的空间,才把你new的资源结束掉。
也是就是说,new的资源,你不释放,程序不结束,就一直被占用着的,这就是堆空间。堆空间一般比较大,比栈空间要大,但是访问要比栈慢。。
[其他解释]
先搞清楚何用new, delete
char* name是在上分配的,不是在堆上面分配。
[其他解释]
我是初学者,能详细说下吗?
------其他解决方案--------------------
谢谢,晚上回去弄弄看。
[其他解释]
谢谢上面2位朋友的回复
确实release版本可以正常结束。
为什么debug版本不能正常结束呢?
[其他解释]
让编译器进行了优化