我发现的一个怪问题,大家试试你的VC呢?
前几天程序出了一个问题,我追了它几天几夜,
现在问题是找到了,也解决了,
但是我还是不明白为什么会出这个问题。
属于“知其然不知其所以然”
之所以这个问题要追几天几夜,
也正是因为怎么也没想到问题出在这里。
我的程序很复杂,
为了说明情况,我另外写一个很简单的程序,
虽然简单,但是冒出的问题是一样的。
我写的类,其成员变量都是一些基本数据类型,
比如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.
我真是百思不得其解了,
有谁知道吗?