直接上代码:整个项目中由于使用了引用计数机制,而导致内存重复被释放,多线程锁对引用计数的控制等问题极具暴露出来,所以出现了一下等情况的报错。
/C++面试题
#if 1
struct MyStruct
{
MyStruct(float _f, int _n)
{
cout << "MyStruct::MyStruct" << endl;
f = _f;
n = _n;
}
virtual ~MyStruct()
{
cout << "MyStruct::~MyStruct" << endl;
}
float f;
int n;
};
int _tmain(int argc, _TCHAR* argv[])
{
//下列程序会有什么问题?
MyStruct* ps = new MyStruct(1.0, 2);
void* pv = (void*)ps;
delete ps; // 1. 不转会调用~MyStruct()
/*
* delete ps; // 2. 多次调用析构函数~MyStruct(),会double delete
* Unhandled exception at 0x00A79259 in 函数调用操作符的声明与定义.exe: 0xC0000005: Access violation reading location 0xFEEEFEEE.
*/
delete pv; // 3. 不能调用~MyStruct() 不管是否为virtual
ps->f = 2.0; // 4.
ps->n = 3; // 5.
cout << ps->n << endl; // 6.
///
void* pf = new float(3.0); // 对内存地址进行重新格式解析
cout << *(int*)pf << " " << int(*(float*)pf) << endl;
system("pause");
return 0;
}
#endif
结论:
1. 调用~MyStruct析构函数
2. 重复delete ps对象-》
3. 通过指针void*转换后调用delete pv; 不会调用~MyStruct的析构函数,重复释放会报错。
4.5.6. 会引发一些异常
点击Break之后
再点continue 或者 F5 会执行后续代码,直接点击continue 也就不用进去上面截图,直接运行后续代码。