导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

函数内(new)开辟内存空间报错!

adder01 2009-08-28 08:56:24
Cist(BYTE *a, int width, int height)
{
int wth,hgt; //扩展图像的宽和高
wth = width + 2;
hgt = height + 2;

long len=wth*hgt;

BYTE *b = new BYTE[len]; //!该行编译通过,执行时有时后报错

for( int i = 0; i < hgt; i++) //拓展的边缘补0
for ( int j =0; j < wth; j++ )
{
if ( j%wth == 0 || (j+1)%wth == 0 ||
i == 0 || i == hgt-1 )
b[i*wth + j] = 0;
else
b[i*wth + j] = a[(i-1)*width+(j-1)];
}
}



在函数内开辟空间报错,len=70000左右.  为什么会显示 0xc00000005 access Violation 错误!
这不是在堆上开辟的空间吗? 我在其他类的函数里面开辟更多的空间都没有问题.





...全文
121 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cau228charm 2011-09-01
这个帖子对我有用
回复
adder01 2010-02-11
感谢各位朋友,今天发现该贴还没有结贴,问题我已经发现了,saylerboxer说的对,我有段内存访问越界了,当时没有表现错误,但是已经把堆栈破坏了,下次再去开辟内存时就会报错。
回复
adder01 2009-08-29
非常感谢各位的提醒,我再仔细看看内存分配和回收,有没有什么调试工具可以用?
回复
schlafenhamster 2009-08-29
BYTE *b = new BYTE[len]; //没有delete
回复
野男孩 2009-08-29
[Quote=引用楼主 adder01 的回复:]

在函数内开辟空间报错,len=70000左右.  为什么会显示  0xc00000005 access Violation  错误!
这不是在堆上开辟的空间吗? 我在其他类的函数里面开辟更多的空间都没有问题.

[/Quote]

BYTE *b = new BYTE[len]; //!该行编译通过,执行时有时后报错
很有可能是在此之前已经有内存错误发生的,通常是越界或者释放后还被访问过。但是没有立马表现出来。直到又有new的动作时才发现。
回复
猞猁狲 2009-08-29
条件判断的代码,当i=0时如果进入else条件,这句
b[i*wth + j] = a[(i-1)*width+(j-1)]; 中的 a[(i-1)*width+(j-1)] 数组下标会成为很大的负值
访问越界
回复
zgl7903 2009-08-28
报0xc00000005 access Violation 错误时查看上一级堆栈,
或者在调试选项中Exceptions开启 Cxxxx5一项, 到时就停下来了,估计还是访问越界
回复
adder01 2009-08-28
[Quote=引用 2 楼 whg01 的回复:]
width*height=多少?是不是大于70000了?
另外不止b会越界,a也会。
b[i*wth + j] = a[(i-1)*width+(j-1)]; 你要判断一下是哪个越界了。
[/Quote]


已经大于70000了,是有什么要求不能大于70000吗?但是我其他函数内开辟的空间更大,有1280x960.

就是在运行到这里 BYTE *b = new BYTE[len]; 会报错,有时候第一次可以,但第二次报错.
下面的复制还没有执行.

delete []b 代码加在函数结束前 .
回复
feilinhe 2009-08-28
你确保传入的a没问题?
回复
调试即可看到,当出现内存错误时,具体参数的runtime值,估计是空间开小了。而且你这边只new没有delete。
回复
whg01 2009-08-28
width*height=多少?是不是大于70000了?
另外不止b会越界,a也会。
b[i*wth + j] = a[(i-1)*width+(j-1)]; 你要判断一下是哪个越界了。
回复
adder01 2009-08-28
CWinThread* pWinThread = AfxGetThread();
if ( pWinThread != NULL )
{
lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
TRACE1("Warning: Uncaught exception in WindowProc (returning %ld).\n",
lResult);
}

按F11单步运行,进入了这里,在
lResult = pWinThread->ProcessWndProcException(e, &pThreadState->m_lastSentMsg);
出现错误.

new 一块内存这么麻烦,急切请高手指点

回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……