我发现的一个怪问题,大家试试你的VC呢?

toumao 2005-12-14 03:05:31
前几天程序出了一个问题,我追了它几天几夜,
现在问题是找到了,也解决了,
但是我还是不明白为什么会出这个问题。
属于“知其然不知其所以然”
之所以这个问题要追几天几夜,
也正是因为怎么也没想到问题出在这里。

我的程序很复杂,
为了说明情况,我另外写一个很简单的程序,
虽然简单,但是冒出的问题是一样的。
我写的类,其成员变量都是一些基本数据类型,
比如int, unsigned int, char等。
代码如下:

class A
{
public:
A();
virtual ~A();
private:
int i;
int j;
};
A::A()
{
memset(this, 0, sizeof(A));//这一行注意
}
A::~A()
{
}

void main(void)
{
A* p = new A;
try
{
delete p;
}
catch(...)
{
printf("error\n");
}
}

这个类的定义与实现都没什么问题,
只不过我加了一个memset函数,给内存清零。
结果这样就导至delete不能正常运行。
按理说我可以不用memset函数的,
但是我这个软件要把有用信息写入硬盘文件,
如果只是要写文件和读文件也就算了,
但是现在是测试阶段,我还想用UltraEdit打开来看看文件的内容。
VC++的DEBUG版会自动在new申请的内存里写入0xCD,
这些信息虽然不影响程序运行,却影响我亲自查看文件内容,
所以,我最初的想法是把new来的内存都填入0x00,
这一个操作并没有影响new的结果,
实际证明,new完全正常,其后的所有操作也完全正常,
就是最后这一步,delete却出错,
GetLastError()的返回值是183
表示:Cannot create a file when that file already exists.
我真是百思不得其解了,
有谁知道吗?
...全文
203 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
crushor 2006-03-12
  • 打赏
  • 举报
回复
你可以删除帖子
但是我回复过了你就不能删除了,除非申请斑竹帮你删除.
把原因说清楚点啊,我只是想到,这时是相当于delete null,当然会失败,至于你的目的,完全可以用其他方法实现.
手插兜兜 2006-03-12
  • 打赏
  • 举报
回复
同意楼上的,你用C++的风格写程序,而类的内部用c风格的函数,强制清空类指针指向的空间,肯定出问题。这种方法,我感觉是很危险的.
zylthinking 2006-03-12
  • 打赏
  • 举报
回复
学习
菜牛 2006-03-12
  • 打赏
  • 举报
回复
你这样在任何C++编译器中都会出问题,与VC无关,纯粹的逻辑错误。
ncucf 2006-03-12
  • 打赏
  • 举报
回复
memset函数不要滥用,因为每个类都要额外一些信息,来存储这个类大小等信息,你把它也清空了,自然delete的时候,就出错了!
toumao 2006-03-12
  • 打赏
  • 举报
回复
你们真是热心啊,
我说了这个问题早就解决了的。
跟NicholasWu(尼古)说的一样。
herman~~ 2006-03-12
  • 打赏
  • 举报
回复
同意:NicholasWu(尼古
ztony007 2006-03-12
  • 打赏
  • 举报
回复
同意楼上的
NicholasWu 2006-03-12
  • 打赏
  • 举报
回复
因为你清零的时候破坏了类的虚函数表指针,析构的时候调用错误的地址.如果你去掉析构函数前面的virtual关键字,应该正常
toumao 2006-03-11
  • 打赏
  • 举报
回复
问题早就弄清楚了,
原因也找到了,
但是,
这一帖无法结,因为没人回贴,分送不出去,
而不把分送掉,又不允许结贴,
论坛开发的人没考虑这种情况?
哈哈哈。
toumao 2005-12-14
  • 打赏
  • 举报
回复
怎么老有这种我发了帖却找不到,只好到“我的问题”去找的事?

16,473

社区成员

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

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

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