char *p与内存泄漏
(1)
char *p = new char[20];
p = "abc";
(2)
char *p = "abc";
p = "xyz";
请问各位,以上(1)和(2)两种情况是否都会导致内存泄漏?如何修改才能避免?请详解。
问题点数:20、回复次数:12Top
1 楼axx1611(long long *&ago)回复于 2006-12-01 00:40:11 得分 5
1会2不会
正确的为:
char *p = new char[20];
strcpy(p, "abc");
...
delete [] p;
Top
2 楼itbear(Victor)回复于 2006-12-01 00:46:46 得分 0
为什么(2)不会?不是指针a先指向“abc”,然后a又指向“xyz”,这两个字符串不是地址不同吗?
难道p ="xyz";这句是把"xyz"拷贝到原来"abc"分配的内存单元中吗?Top
3 楼kenneth_lueng()回复于 2006-12-01 08:13:59 得分 5
内存泄漏指的是堆内存泄漏(heap)
char *p = "abc"; //只是从栈中分配内存,系统会自动回收资源
p = "xyz";
"abc" 和 "xyz"都是常量字符串,是在常量区分配的,并不是堆中分配
Top
4 楼jackexu()回复于 2006-12-01 08:21:47 得分 2
简单的来说,用new分配的空间,结束前一定要释放,不然会泄露,
2没有Top
5 楼myfriend023()回复于 2006-12-01 08:33:58 得分 2
char *p = new char[20];
用new分配空间 并不给所分配的空间赋值
p = "abc";这里已经把p指向了常量区的一块地址 p已经不再指向原来用new分配的堆地址 所以原来的new的 没有指针记录的话 你用delete就释放不了了
Top
6 楼axx1611(long long *&ago)回复于 2006-12-01 09:16:17 得分 2
kenneth_lueng(kenneth)意思说对了,不过有一点,"abc" 和 "xyz"并不是分配到“常量区”(阁下是想说数据段??),而是分配在附加段里
而p这个指针的四个字节在栈中分配,由于附加段和栈都是固定大小,所以不存在memory leak的问题。Top
7 楼shawnwan()回复于 2006-12-01 09:26:04 得分 1
2不会,2没指向NEW的数据,
另
DELETE P 后记得 P =null可以减少出错的机会Top
8 楼my_web(交流qq:517664276)回复于 2006-12-01 09:39:37 得分 0
1会2不会,原因同上Top
9 楼augustusqing(喜欢雨路的火焰狼)回复于 2006-12-01 09:40:26 得分 0
看来楼主跟我几天前一样,对堆,栈,常量区分得比较迷糊,:)Top
10 楼todototry(来csdn,学会扯淡了...)回复于 2006-12-01 09:41:40 得分 3
(1)
char *p = new char[20];
p = "abc";
(2)
char *p = "abc";
p = "xyz";
=======================
(1)p拿到20个字符的一块内存的地址,然后又指向常量区的“abc”,所以把申请的内存的地址丢掉了,怎么释放,所以泄漏
(2)p是一个指针变量,首先指向常量区的“abc”,然后又指向常量区的“xyz”,常量区的数据,编译器负责的,所以并不需用户管理Top
11 楼kenneth_lueng()回复于 2006-12-01 10:27:48 得分 0
to axx1611(long long *&ago)
其实字符具体分配在什么地方,可能也跟编译器有关,而且说法也很多种
按阁下的说法,应该是有点在差不多汇编的角度来看了,不知说得对不对 :)
而现在大多的针对C 或者 C++来说,基本上把这些数据段统称为常量区
再细一点可以称为“文字常量区”Top
12 楼axx1611(long long *&ago)回复于 2006-12-01 12:43:24 得分 0
to LS:
呵呵
如果将其称为“静态区”可能会跟容易让我接受,因为const类型的数据有可能就是在栈中的,说“常量区”未免有点名不副实。
不过不管是什么区,楼主的问题都是回答对了。。
Top





