社区
C++ 语言
帖子详情
用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
打赏
收藏
用new分配内存的问题!!
#include using namespace std; int main() { char *p = new char; cin>>p; cout<<p<<endl; system("pause"); return 0; } 这里理论上分配了一个char的内存给p为什么输入abc时也可以输出abc呢??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
动态
分配内存
——
new
/delete
使用
new
分配内存
2.使用delete释放内存 1.使用
new
分配内存
使用格式:
new
数据类型
new
经常和指针一起使用,指针真正的用武之地就是在运行阶段指向未命名的内存以存储值。 eg:在运行阶段为一个int值分配未命名的...
C++学习10:使用
new
分配内存
今天就来学习使用
new
分配内存
。
new
的作用和使用方法:
new
的作用在于可以在程序运行阶段动态
分配内存
,内存的大小在运行时根据需要确定,从而高效利用内存空间。
new
的使用方法如下: typeName* pointer_name =
new
...
c++中用
new
分配内存
new
的作用在于可以在程序运行阶段动态
分配内存
,内存的大小在运行时根据需要确定,从而 高效利用内存空间。
new
的使用方法如下: typeName* pointer_name =
new
typeName 使用时用户需要指定类型(指针类型和要开辟...
使用
new
分配内存
、创建动态数组、
1、使用
new
来
分配内存
程序员需要告诉
new
,需要为哪种数据类型
分配内存
;
new
将找到一个长度正确的内存块,并返回该内存块的地址,程序员的责任是将改地址...注意,使用
new
分配的动态内存要用delete删除,对应格式: ...
C++:
new
分配内存
#include <stdio.h> #include <malloc.h> #include <iostream>... //动态的在堆上分配一块内存(手动分配) cin >> *p1; cout << *p1 << endl; cout << p...
C++ 语言
64,651
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章