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 ;
...全文
157 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧