char* p = new char 然后delete p 的问题!

forestassure 2003-08-12 03:03:58
why : char * p = new char ; delete p ; -----> wrong
but int * p = new int ; delete p ; right ?

char * p = new char ;
int * i = new int ;
p = "hi ";
cout<<*p <<endl;
*i = 123 ;
//delete p;
cout << *i<<endl;
delete i ;
delete p ;
...全文
115 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yhspring 2003-08-14
这个问题可以结贴了
  • 打赏
  • 举报
回复
寻开心 2003-08-13
开什么玩笑呐!!

p = “pi”
不是内存溢出
注意在c++当中 “pi”是常量指针,它的分配方式和全局变量一样是在系统栈当中,所以你不能够直接delete它,只有当函数结束的时候随函数一起消亡。

上面的赋值语句,只是改变了p的数值,不信你就跟踪看看。
但是这样造成了已经分配给p的内存丢失了,没有其他指针再指向这个已经分配的内存,当程序退出的时候造成了内存泄漏。

如果你要知道原理,而且不怕麻烦的话,你就自己写点代码,跟踪一下指针的变化就知道了。
  • 打赏
  • 举报
回复
forestassure 2003-08-13
问题更深入些
可否想想
strcpy(p,"aaa")
内部是如何工作的??
  • 打赏
  • 举报
回复
MySelfWay 2003-08-13
同意 boodweb(TTT)!
  • 打赏
  • 举报
回复
feathersky 2003-08-13
嘿嘿 我开始没仔细看 说错了
  • 打赏
  • 举报
回复
boodweb 2003-08-13
strcpy的工作原理很简单
以strcpy(p1,p2)为例等价于
{
int i=0;
while(p2[i]!='\0') {p1[i]=p2[i];i++;}
}
  • 打赏
  • 举报
回复
boodweb 2003-08-12
"好象是对的!"
~~~~~~~~~~~~~根本不对!!!仔细看看上面的解释!!!!!
应该用strcpy(p,"aaa")
  • 打赏
  • 举报
回复
forestassure 2003-08-12
小结:
1. char * p = new char ; just allocate one char
p = "hi ";
memory overflow

int * i = new int ;
*i = 123 ;
no memory overflow

the right should be : *p = 'a';
"hi" is 指针
2.但是如果想将一字符串赋给一指针,又该如何呢
如果: char * p = new char[4];
p = "aaa";
delete [] p ;
好象是对的!但是也会出现问题。


  • 打赏
  • 举报
回复
寻开心 2003-08-12
sorry
没有细看
应该是这样的
首先 p = new char返回的是一个字节的指针
其次
p = "pi";
把一个常量字符串的指针付给了p,会导致p原来指向的内存被忽略,造成内存泄漏。
其次delete p的时候,会因为delete字符串常量,而出现非法操作。
  • 打赏
  • 举报
回复
feathersky 2003-08-12
Error Message 中有 memory lost吗 好像没听说过呀
  • 打赏
  • 举报
回复
yhspring 2003-08-12
boodweb(TTT) ( ) 说得对,"pi"实际上是一个const char *,而p是一个char *
  • 打赏
  • 举报
回复
boodweb 2003-08-12
我觉得楼上说的不对
p="hi";
这句话并不是把"hi"填到p指向的地方,而是把p指向在全局数据区的"hi"字符串
所以楼主的程序delete的是指针指向的是const的数据
此外楼主还造成了memory leak,分配的char并没有被销毁
  • 打赏
  • 举报
回复
BlueSky2008 2003-08-12
faint,根本不是什么 memory overflow,而是memory lost

关键是 p = "hi ";
这句本身是没有问题的,它把字符串常量"hi "的地址赋给指针p,没有overflow
但问题是p原来的值:指向new分配的内存的地址就丢失了。

后面 delete p;是要去释放程序的静态数据区中存放"hi "的那块内存,而不是new分配的内存,当然出错!
  • 打赏
  • 举报
回复
BlueSky2008 2003-08-12
faint,根本不是什么memory overflow,而是memory lost
p = "hi ";
这句本身是没有问题的,它把字符串常量"hi "的地址赋给指针p,
p原来的值:指向的new分配的内存的地址就丢失了。

然后delete p;就是去释放存放"hi "字符串的程序的静态数据区的内存,而不是new分配的内存,当然出错!
  • 打赏
  • 举报
回复
mmmcd 2003-08-12
就是
  • 打赏
  • 举报
回复
寻开心 2003-08-12
char * p = new char[3];
就对了
  • 打赏
  • 举报
回复
寻开心 2003-08-12
楼上对
不是delete的问题,
是你的指针操作越界后造成的
  • 打赏
  • 举报
回复
feathersky 2003-08-12
char * p = new char ; just allocate one char
p = "hi ";

memory overflow

int * i = new int ;
*i = 123 ;
no memory overflow
  • 打赏
  • 举报
回复
相关推荐
发帖
数据结构与算法
加入

3.2w+

社区成员

数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
申请成为版主
帖子事件
创建了帖子
2003-08-12 03:03
社区公告
暂无公告