社区
C++ 语言
帖子详情
动态申请内存(NEW)常常失败,为什么?
geland
2004-09-10 12:44:32
我在程序里经常会申请存储空间,不知道为什么,NEW操作常常会抛出异常,申请失败,数量一般每次是100K之内,还有就是如果有一次失败了的话,后面的申请操作全部都失败,请大家帮忙分析有那些原因,机器上的内存是有的,就是说我作过实验,在别的程序里,循环申请几百M内存都不会失败。
...全文
531
26
打赏
收藏
动态申请内存(NEW)常常失败,为什么?
我在程序里经常会申请存储空间,不知道为什么,NEW操作常常会抛出异常,申请失败,数量一般每次是100K之内,还有就是如果有一次失败了的话,后面的申请操作全部都失败,请大家帮忙分析有那些原因,机器上的内存是有的,就是说我作过实验,在别的程序里,循环申请几百M内存都不会失败。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Wolf0403
2004-09-10
打赏
举报
回复
比较奇怪,step in 一下看看,是不是分配的数量有错误……
geland
2004-09-10
打赏
举报
回复
谢谢热心的朋友们!
geland
2004-09-10
打赏
举报
回复
我就是说有这方面经验的朋友给一些忠告!
goodluckyxl
2004-09-10
打赏
举报
回复
不会吧
new是在堆上分配
只要有虚存都是可以分配的
是不是os出了问题
重起一下看看有没有问题
freefalcon
2004-09-10
打赏
举报
回复
好像是比较奇怪
freshairfly
2004-09-10
打赏
举报
回复
这怎么分析啊,什么都没有。。。。
lsdkzkald
2004-09-10
打赏
举报
回复
不是编译器问题或者IDE吧。
真是奇怪啦。
sdot
2004-09-10
打赏
举报
回复
来晚了,要说的话都被人说完了,哈哈
ly2004_mj
2004-09-10
打赏
举报
回复
我有点奇怪?为什么不用数组来做,而非要用指针?我倒觉得哪一种方法好使就用哪一种方法!
geland
2004-09-10
打赏
举报
回复
怎么跑题了呀,我的问题还没有解决呀
liluvu
2004-09-10
打赏
举报
回复
要在类的构造函数里为p分配空间吧
talentyang
2004-09-10
打赏
举报
回复
在 new 分配了移个a的指针, achout->p分配了一个char*的指针
achout->p="string" 指向了一个静态存储区,
用gets()怎么能写.
hearlihong
2004-09-10
打赏
举报
回复
呵呵
漂流的代码
2004-09-10
打赏
举报
回复
来晚了,哈哈
chenqing1128
2004-09-10
打赏
举报
回复
牛×
thunderclap
2004-09-10
打赏
举报
回复
achout =new a; //new 了一个char*的空间,用来存放指针p的地址&p
achout->p="string"; //使p指向一个字符串常量。
gets(achout->p); //企图修改常量的内容#83,你厉害啊。
hearlihong
2004-09-10
打赏
举报
回复
哦,这样啊。谢谢了,那么new到底做了什么呢?
geland
2004-09-10
打赏
举报
回复
你实际上只分配了一个char *的空间,该指针没有指向合法的存储区域!
geland
2004-09-10
打赏
举报
回复
你并没有为分配到空间,
achout->p="string";表示P指向了一个只读存储区,
你用gets(achout->p);是要往里面写,肯定会错的
hearlihong
2004-09-10
打赏
举报
回复
include <stdio.h>
#include <iostream>
class a {
public:
char *p;
};
int main(void)
{ a *achout;
achout =new a;
achout->p="string";
printf("%s\n", achout->p);
gets(achout->p);
printf("%s\n", achout->p);
return 0;
}
我这里也有个关于内存分配的问题。
我在a中已经用new为p分配了空间,并且可以将“string”赋值到p中去,但是当我用gets函数输入的时候就出错,为什么?
还有,当我用new分配的时候,我的p到底被分配了多少空间呢?
是动态分配吗?
加载更多回复(6)
引发
new
/malloc
动态
申请
内存
失败
的常见原因分析与总结
本文结合以往项目中遇到的多个问题实例,给大家详细总结一下引发
动态
申请
内存
失败
的常见原因,以供借鉴或参考。
C++中
new
申请
内存
失败
抛出异常的处理
正常情况下,执行
new
操作时都能
申请
到
内存
,并返回一个有效的地址。但在某些异常的情况下,会出现
申请
内存
失败
的情况。
new
操作返回NULL
申请
不到
内存
,或者
new
时抛出异常,可能有以下几种原因引起的: 1)用户态的
内存
已经达到了上限,
申请
不到
内存
了 有可能是虚拟
内存
占用太多,也有可能代码中有
内存
泄露,导致用户态的
内存
被消耗完了。 2)进程中的
内存
碎片过多 如果进程中在大量的
new
和delete,产生了大量的小块
内存
碎片,可用的
内存
大多是一小块一小块的小
内存
块,而要
申请
的是一块长......
C++ 中 用
new
申请
堆空间
失败
之后,怎么进行错误处理
在使用
new
运算符时,如果
动态
分配
内存
失败
,将返回一个空指针。在这种情况下,我们可以通过检查返回的指针是否为空来判定分配
内存
是否成功。一种处理
申请
堆空间
失败
的方法是抛出异常。可以使用 std::bad_alloc 异常类来表示
内存
分配
失败
的情况。 一种处理
申请
堆空间
失败
的方法是抛出异常。可以使用 std::bad_alloc 异常类来表示
内存
分配
失败
的情况。
new
和malloc
申请
内存
失败
后的处理
1.c++标准
new
失败
是抛出异常的,Visual C++ 6.0中返回一个NULL指针. 使用
new
(std::nothrow)可以保证
失败
时返回NULL; 因此完全可以#define
new
new
(std::nothrow) . 2.使用 malloc/calloc 等分配
内存
的函数时,一定要检查其返回值是否为“空指针”,返回空指针表示
申请
内存
失败
。 eg: #define ne...
new
申请
内存
失败
了乍办
1.标准C++ 里,如果
new
分配
内存
失败
,默认是抛出异常的。 首先按c++标准的话,
new
失败
会抛出bad_alloc异常 try { double *ptr=
new
double[1000000]; } catch(bad_alloc &memExp) { //
失败
以后,要么abort要么重分配 cerr<<memExp.what()<&...
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章