用new分配内存的问题!!

tjj5203 2008-03-20 10:00:13
#include <iostream>
using namespace std;
int main()
{
char *p = new char;
cin>>p;
cout<<p<<endl;
system("pause");
return 0;
}
这里理论上分配了一个char的内存给p为什么输入abc时也可以输出abc呢??
...全文
650 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongdapeng110 2008-04-06
  • 打赏
  • 举报
回复
搂主可试试如下代码:
int main(void)
{
int *pi = new int(100);
char *p = new char;
cin >> p;
cout << p << endl;
cout << *pi << endl;
return 0;
}
输入100个字符,看看什么效果。
在我的机器上是程序异常了,因此虽然你的程序没有出错,但由于你已经改写了你不该访问的内存,因此。隐患已经残生了。
zgjxwl 2008-03-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fetag 的回复:]
首先要明确一个问题,你new出来的内存是在OS的堆上的,也就是常说的heap上。

其次,C++是不管理越界的问题的,这个要靠程序员自己去控制。你申请的确实是一个char大小的内存,在使用的时候,却超过了这个大

小,OS默认的行为是不管你的,但是这样你的程序就有了一个隐患。如果你申请的那个char后面的内存是别的程序申请了的,你就把别的程序

的内容给覆盖了,无意间对别人产生了破坏...
[/Quote]

过儿讲的正确,我撤回上面的了
不过楼上这位朋友,我还是有些问题没解决
不过我是秉着学习的态度的,呵呵...对误导了的别人只能说不好意思了
ysuliu 2008-03-23
  • 打赏
  • 举报
回复
你真的明白了吗?
我认为你曲解了3楼的意思。你说的不正确,而且好像也误导了别人。
你可以试一下看看,p在赋值前跟赋值后的地址是不是一样的,这个很容易验证吧。

我告诉你我验证的结果,地址是一样的。

其实这个问题就是一个越界的问题,怎么又扯出来内存泄漏了。
楼主的代码确实是有内存泄漏,不过不是因为给p赋了一个长字符串,而是因为没有把p回收,这根本就是两个问题。

为什么赋值abc没有出问题,因为abc还不够长,还不至于影响到其他进程的内存。
我告诉你一个验证的方法:
1,你按照楼主的程序先把p分到的地址打出来
2,那个地址+3后,给这个地址写数据(这个应该会吧,不会就上网找,随便写点什么数据都行)
3,然后再给p赋值,你赋个长字符串看看运行的效果

Note:执行完步骤一后,需要修改代码给地址写数据,重新编译。不过如果你没有什么其他程序操作的话,两次的p的地址一般是一样的。
其实13楼说的是很正确的。
这种情况是危险的,但并一定是肯定出问题的。

[Quote=引用 14 楼 zgjxwl 的回复:]
引用 3 楼 zhb200692279 的回复:
p是一个字符指针,相当于将“abc”的指针赋给p。
因为“abc”的指针是第一个字符的指针,与p的类型相同。



注:3楼正解.如果三楼说的不太好理解>似乎可以这样说(不妨这样去理解,可能说法是错的,但有助于理解)

标准输入流对象cin现在应该还没有功能读入一个地址把,但是事实显示的是可以的(编译器没报错,正常通过)

为了理解,只能说这一切都是在内部进行的,(假想)不妨这样去理解…
[/Quote]
lukziliary 2008-03-23
  • 打赏
  • 举报
回复
等待高手,泄露应该不会吧,我看了一下,cin的时候,内存地址没变
cloudwoods 2008-03-23
  • 打赏
  • 举报
回复
自己纠正:1. 原来new的内存不是溢出,应该说泄露了
cloudwoods 2008-03-23
  • 打赏
  • 举报
回复
小小总结一下,目前大致有两种解释:
1. 指针p存的地址值改变了,指向了cin输入的字符串的地址,原来new的内存溢出了;
2. 指针p存的地址值没有改变,cin输入的字符串值存在了new的内存里,但是超出了分配的范围而溢出了

15楼的程序已经证明了p的地址值实际没有改变,并且又确定了输入过多的字符会导致出错(自己都试过),所以是否可以认为第2种解释是正确的呢?
个人倾向于第2种正确。。
dorimifa001 2008-03-22
  • 打赏
  • 举报
回复
mark
fengzi_shen 2008-03-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zgjxwl 的回复:]
引用 3 楼 zhb200692279 的回复:
p是一个字符指针,相当于将“abc”的指针赋给p。
因为“abc”的指针是第一个字符的指针,与p的类型相同。



注:3楼正解.如果三楼说的不太好理解>似乎可以这样说(不妨这样去理解,可能说法是错的,但有助于理解)

标准输入流对象cin现在应该还没有功能读入一个地址把,但是事实显示的是可以的(编译器没报错,正常通过)

为了理解,只能说这一切都是在内部进行的,(假想)不妨这样去理解…
[/Quote]
说的非常好,大概能理解了,就是p指向了新的地址,当然可以输出了,然后new char分配的内存泄漏
liulin1982 2008-03-22
  • 打赏
  • 举报
回复
来看看!
ZiSheng 2008-03-22
  • 打赏
  • 举报
回复
路过
tjj5203 2008-03-22
  • 打赏
  • 举报
回复
感觉意见有几个,但拿不定哪个是对的,不过,总之内存会泄露!!!
great3779 2008-03-22
  • 打赏
  • 举报
回复
这样是能够输出"abc"的,但是可能会对其他进程的内存造成破坏,严重时,还可能导致程序的崩溃。
g012345678 2008-03-22
  • 打赏
  • 举报
回复
现在主要是做网页设计了,所以C++都忘记了
herman~~ 2008-03-22
  • 打赏
  • 举报
回复
程序越界
hurry281 2008-03-21
  • 打赏
  • 举报
回复
abc 是常量,相当于字符串常量,是在常量区的,将p 指针指向了常量,输出当然也是abc了;
jdk521 2008-03-21
  • 打赏
  • 举报
回复
学习!
okhere 2008-03-21
  • 打赏
  • 举报
回复
程序肯定越界了。只是由于代码太少,还没有出现问题而已。
晨星 2008-03-21
  • 打赏
  • 举报
回复
是“堆上”,打错了。
晨星 2008-03-21
  • 打赏
  • 举报
回复
即有巧合,又有一定的非偶然因素,比如栈上的内存分配中为了字对齐而浪费的空间正好被你利用了。
这些都是些偏底层的东西,而且不同的平台、不同的编译器下都不一样,也没个准。
最好还是不要这样用了。
yqw945 2008-03-21
  • 打赏
  • 举报
回复

输入abc编译器不会出现什么错误,但是如果输入超过12个字符就会出现内存读写错误,还请高手指教!

加载更多回复(19)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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