内存释放问题

dkbrain 2009-12-10 10:10:12
//定义结构体
typedef struct _PIXEL_ANALYSE
{
BYTE min;
BYTE max;
BYTE average;
double standard_deviation;
}mPixelAnalyse, *pPixelAnalyse;

//以下程序是定义结构体变量并分配内存
pPixelAnalyse pPAResult;
pPAResult = new mPixelAnalyse[density];
memset(pPAResult,0,sizeof(mPixelAnalyse) * density);
……
delete[]pPAResult; //这儿释放内存的时候就会出错,编译的时候没有错误提示,程序运行到这儿时就是中断,提示说堆内存被损坏,但如果把这句注释掉,程序是可以正常实现功能的,不过会有内存泄露。

/*---------如果按下面这样来分配内存就不会出粗,可以正常释放内存---------*/
pPixelAnalyse pPa;
pPa = new mPixelAnalyse;
memset(pPa,0,sizeof(mPixelAnalyse));
……
delete pPa; //此时内存就可以正常被释放

//我想请教的是为什么结构体内存数组new出来的内存不能被正常释放呢?
//难道一定要一个for循环来为每个结构体数组中的每个元素来new内存空间?
...全文
85 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dkbrain 2009-12-10
  • 打赏
  • 举报
回复
问题解决了
pPixelAnalyse pPAResult;
pPAResult = new mPixelAnalyse[1000];
memset(pPAResult,0,sizeof(mPixelAnalyse) * 1000);
delete[]pPAResult;
这样就没有问题了。
我的程序之所以出错,是因为在程序中数组访问越界了。
reneeland 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 tr0j4n 的回复:]
你把delete[]pPAResult;  改成for里面一个个delete看看?
[/Quote]

是啊,我也比较好奇!
MoXiaoRab 2009-12-10
  • 打赏
  • 举报
回复
你把delete[]pPAResult; 改成for里面一个个delete看看?
MoXiaoRab 2009-12-10
  • 打赏
  • 举报
回复
你看下pPAResult[0]-pPAResult[n]每个结构体之间是否是连续的,如果不是连续的,可能就有问题了
dkbrain 2009-12-10
  • 打赏
  • 举报
回复
density是720;
我估计应该是数组使用的时候越界了,正在检查程序中,估计应该不是memset()函数有问题。
reneeland 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zgl7903 的回复:]
这个有一个结构体边界对齐的问题, 加一行int nSize=sizeof(mPixelAnalyse),看看结构体长度是多少?
编译器默认的是8个字节的,所以sizeof(mPixelAnalyse)会是16个字节,而new mPixelAnalyse分配出来的是11个字节,自然在memset的时候也就是越界操作了
1可以把结构体凑成16字节,
2可以项目中设置结构体对齐为1字节,或在头文件中加入#pragma pack(1)宏
3使用用malloc GlobalAlloc之类内存分配方式的操作
[/Quote]
涉及到内存分配方式的问题,使用malloc试试,应该就没事了~~~
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zgl7903 的回复:]
而new mPixelAnalyse分配出来的是11个字节,自然在memset的时候也就是越界操作了
[/Quote]
你想当然了。
gamedragon 2009-12-10
  • 打赏
  • 举报
回复
你density是0?
zgl7903 2009-12-10
  • 打赏
  • 举报
回复
这个有一个结构体边界对齐的问题, 加一行int nSize=sizeof(mPixelAnalyse),看看结构体长度是多少?
编译器默认的是8个字节的,所以sizeof(mPixelAnalyse)会是16个字节,而new mPixelAnalyse分配出来的是11个字节,自然在memset的时候也就是越界操作了
1可以把结构体凑成16字节,
2可以项目中设置结构体对齐为1字节,或在头文件中加入#pragma pack(1)宏
3使用用malloc GlobalAlloc之类内存分配方式的操作
凤朝凰 2009-12-10
  • 打赏
  • 举报
回复
不懂,好奇。
顶起期待高手。
  • 打赏
  • 举报
回复
memset之后立即delete[]
看看会不会报错,要是不会报错,那就是使用的时候越界了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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