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

很简单的关于c++操作符new delete的菜鸟级问题,分值100!

yjs_soft 2002-07-29 10:29:16

typedef struct CBinfo
{
char name[14];
long ID;
int DB_DH;
}CBINFORMATION;


class CCBLINKApp : public CWinApp
{
......
CBINFORMATION* m_cbIn;
......
}
......
CCBLINKApp::CCBLINKApp()
{
......
m_cbIn=NULL;
......
}

BOOL CCBLINKApp::GetParaFunc(CString PathName)
{

if (m_cbIn!=NULL)
{
delete[] m_cbIn;
m_cbIn=NULL;
}
.........
m_cbIn=new CBINFORMATION [nCount];
..........

}
为什么程序一运行到 GetParaFunc(CString PathName)中delete[] m_cbIn时出错?
提示 "Debug Error!
DAMAGE: after Normal block(#117) at 0x00378f98."
我的原意是:因为程序中多次运行GetParaFunc(CString PathName),需每次动态调整m_cbIn数组大小,重新分配内存地址,防止每次运行到GetParaFunc(CString PathName)时,多次分配m_cbIn数组内存,造成内存资源消耗太多.
请各位大侠指点!



...全文
10 点赞 收藏 22
写回复
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjs_soft 2002-08-09
感谢各位的热情指点,由于出差,昨天才回来,一直托到现在才响应各位,抱歉!
我在后来查明了原因:并不是因为new delete 操作符使用的语法不对.
而是数组越界的问题.我在程序中new 了nCount 个 CBinfo结构类型变量,赋值的时候却使用了 nCount+1个,数组访问越界了.delete时当然出错了!
凡是说数组越界的朋友答对了.特别是 liu_feng_fly(谁动了我的~~~~~~~~~~~~~~工资),和我后来查出问题的办法几乎是一致的.
不管正确与否,都得感谢各位,真理越辩越明!
回复
Hanzo 2002-08-02
你跟踪一下m_cbIn看看,delete的时候是不是和new的时候不一样了?
嘿嘿,不用我说你也知道问题在哪儿了吧.
回复
liu_feng_fly 2002-07-30
可能是数组访问越界了.先简单的把
m_cbIn=new CBINFORMATION [nCount];
改成
m_cbIn=new CBINFORMATION [nCount+10];
试试,如果问题解决了,那么一定是你数组访问越界了,然后进一步确定哪里出了什么问题.
typedef struct CBinfo
{
char name[14];
long ID;
int DB_DH;
}CBINFORMATION;
在这个结构里面也有一个数组,是不是这个数组使用的时候访问越界等等.
还有,贴出一些其他代码吧,我想仅仅就你现在贴出的代码来看是没有问题的.
回复
anni 2002-07-30
同意 Aspist(边城浪子)
就你所写的,我看没有错误!前面几位说什么“用delete m_cbIn”之类的人C++肯定没入门啦,
你在别的地方用了delete[]m_cbIn而忘了m_cbIn=NULL是一种可能;
也可能你开始new 了10个;后来new了1 个,m_cbIn可能在程序的另一个地方不小心地指向了new 一个的地址;
有一点可能肯定,你的错误不在你贴出来的代码中
回复
wanglei888 2002-07-30
能把你的代码都贴出来吗?
回复
suntt 2002-07-30
第一次运行的时候你没有分配活动内存,应用delete m_cbIn;
回复
flowingsky 2002-07-30
我看没错!
回复
sunshine_djh 2002-07-30
同意 liu_feng_fly(谁动了我的~~~~~~~~工资)
回复
wanglei888 2002-07-29
我认为错误不在delete [] m_cbIn这儿,并且这一句不能改为delete m_cbIn。

我猜想你的错误可能是:因为你没有保存每次分配的结构的个数,所以使用的时候可能会导致内存越界,是系统保存的关于m_cbIn的长度信息被破坏,这样在delete的时候就会出错。

建议你查查程序的别的地方。
回复
wuxuan 2002-07-29
直接删除m_cbin,
delete m_cbin;
如果想删除分配的空间,最好使用malloc与free函数进行。
回复
lqbn 2002-07-29
同意 lizmei001(暗黑) 的。
回复
mty 2002-07-29
你申明为CBINFORMATION* m_cbIn;用delete[] m_cbIn;当然回出错了.用delete m_cbIn;
delete[] m_cbIn是删除一个指针数组
回复
lizmei001 2002-07-29
好像你定义的是一个指针,却把它当成数组用了:)
回复
7zkeeper 2002-07-29
在你delete[] m_cbIn後你检查一下m_cbIn,他还是不为NULL的,虽然他所占的空间被释放,但他不为空,所以出错,你在删除是做个简单的赋值
m_cbIn = 0即可
回复
Aspist 2002-07-29
就你所写的,我看没有错误!前面几位说什么“用delete m_cbIn”之类的人C++肯定没入门啦,我猜问题可能在别的地方,比如说你在别的地方用了delete[]m_cbIn而忘了m_cbIn=NULL,这时候你new出来的空间已经释放,但m_cbIn并不为NULL,建议你不要用系统的delete,自己写一个类似这样的:
void mydelete(CBINFORMATION* p){
delete []p;
p=0;
}
就能防止此类事情的发生。

回复
fupinger 2002-07-29
你犯了两个错误:
一:你申明为CBINFORMATION* m_cbIn;
用delete[] m_cbIn;当然回出错了.应当使用delete m_cbIn;
二:指针虽然被你delete掉了,但是,它的值还不是NULL,应加上一句:
m_cbIn=NULL;
然后一切OK了。
回复
sunshine_djh 2002-07-29
我也常常遇到这种问题,明明不为空,可就是删除出错,后来也不知道怎么弄的,莫名其妙的解决了,但还是不知道为什么。
回复
ylbug 2002-07-29
关注
回复
himming 2002-07-29
侯捷的书中有关于此问题的详解,你不妨找找,自己看看先!呵呵
回复
Hanzo 2002-07-29
我也遇到过.我直接把delete[]注释掉了,呵呵
关注.
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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

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