使用new时,内存小的可以,大的可以,某个范围内出错

DesertStorm 2003-12-29 03:43:40
做一个图象处理程序,如下语句
m_lpImageData = new unsigned char [ nWidth * nHeight];
m_lpImageData之前从来没有使用过。
当图象很小时,nWidth<200,nHeight<200时 正常;
当图象很大时,nWidth>1000,nHeight>1000时 正常;
当图象的长和宽在400,500左右时 内存申请失败。

换成
m_lpImageData = (unsigned char*) malloc ( nWidth*nHeight*sizeof(unsigned char));
同样的问题发生,图象在500*500左右时,内存申请失败。

有人遇到过这种情况吗?

恳请大侠指教。

...全文
48 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
DesertStorm 2004-01-04
  • 打赏
  • 举报
回复
麻烦各位了,问题已经解决。

原因是:在程序执行到问题语句以前,有内存使用越界的问题。

给各位添麻烦了,以后遇到这种愚蠢的问题还是自己先找找毛病,害各位跟着辛苦。谢谢各位。我把分尽量均分了。
clancy 2003-12-30
  • 打赏
  • 举报
回复
当时我还做了一个试验,用来分配内存,用的是GlobalAlloc和GlobalLock函数,发现它所分配的最大空间应该和系统所在磁盘分区的剩余空间一致。开始用new来分配的,不行,后来用的它。也是作图像处理,需要一个大空间。
sandrowjw 2003-12-30
  • 打赏
  • 举报
回复
当然也可能不是你的程序泄漏,用new、malloc或者LocalAlloc区别不大。
失败是指的返回0还是access violation?
xiaolizi 2003-12-29
  • 打赏
  • 举报
回复
如果在程序启动的时候winmain中分配,看是不是出错,如果正常那说明肯定某个地方有对内存违规操作的代码,需要一步一步调试。
abitz 2003-12-29
  • 打赏
  • 举报
回复
帖点典型代码吧。
你是如何判断申请失败的?
DesertStorm 2003-12-29
  • 打赏
  • 举报
回复
To skyMountain:
我有试过直接写数,不行.
直接写了几组:
100*100正确
500*500错误
1000*1000正确
1000*500错误

我要疯了.和编译选项有关吗?

确实有砸机器的念头,等问题弄明白以后吧.没准用机器砸自己.
DesertStorm 2003-12-29
  • 打赏
  • 举报
回复
对,是在windows/MFC下
我确定nWidth和nHeight正确.
程序比较大啊,光贴那个函数和帖那一句话一样.那个变量以前没用过的.

谢谢clancy,我去试试.但很想知道原因.
BenWong1981126 2003-12-29
  • 打赏
  • 举报
回复
是在windows/MFC下的吗
Jinhao 2003-12-29
  • 打赏
  • 举报
回复
你的内存太小或被某些程序吃了,我的用new int[1024*1024]都没问题
漂流的代码 2003-12-29
  • 打赏
  • 举报
回复
up
clancy 2003-12-29
  • 打赏
  • 举报
回复
如果在MFC下,可以试试
m_hDIB=::GlobalAlloc(GHND, dwSize);
ASSERT(m_hDIB);
lpDIB=(LPSTR)::GlobalLock(m_hDIB);
ASSERT(lpDIB);
函数,我以前遇到过这个问题,用上述方法解决的。
skyMountain 2003-12-29
  • 打赏
  • 举报
回复
跟内存泄漏无关。直接写malloc(500)会不会有问题?如果有,把机器砸了另买一台。没有的话把前面程序贴上来大家学习学习。
datablader 2003-12-29
  • 打赏
  • 举报
回复
第一次听说这样的问题。你肯定Width和Height都有合法值吗?
DesertStorm 2003-12-29
  • 打赏
  • 举报
回复
To sandrowjw:
就是说其他的地方的内存泄露也会导致此处的失败对吧。

有时间的话,能请叫一下原因吗?为什么申请大内存反而成功了呢?

其实,其他地方内存泄露的可能不大。
此语句出现在打开图象时,也就是所有的操作刚刚开始。
sandrowjw 2003-12-29
  • 打赏
  • 举报
回复
前面的程序内存泄漏了,请检查。
cvn 2003-12-29
  • 打赏
  • 举报
回复
unsigned char *p = new unsigned char[500*500];
我试过,没有问题的
victor_cui 2003-12-29
  • 打赏
  • 举报
回复
没听说过,两头可以中间却不行,并且也不可逻辑,嗬嗬,一定是你别的地方搞错了

64,637

社区成员

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

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