【发布时间】:2017-08-09 08:13:20
【问题描述】:
此代码在 Linux 上使用 g++ 编译时可以正常工作,但是当我尝试在 VS 2015(调试和发布)中执行它们时,我收到运行时错误。它出什么问题了?
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
struct Stru1
{
int mem;
};
struct Stru2 : public Stru1
{
char szMem1[256];
int dwMem2;
int dwMem3;
};
static void clFun(Stru1* s) {
Stru2* s2 = (Stru2*)s;
cout << s2->szMem1 << endl;//blahblah
cout << s2->dwMem2 << endl;//runtime error
}
class Temp {
public:
void callDispatch() {
simRecv->mem = 2;
Stru2* sro = (Stru2*)simRecv;
strcpy(sro->szMem1, "blahblah");
sro->dwMem2 = 11;
sro->dwMem3 = 77;
//cout << sro->szMem1 << endl;//blahblah
//cout << sro->dwMem2 << endl;//runtime error when uncommented
clFun(simRecv);
}
~Temp() { delete simRecv; }
Stru1* simRecv = new Stru1;
};
int main()
{
Temp tmp;
tmp.callDispatch();
return 0;
}
错误: 在 ConsoleApplication1.exe 中的 0x0000000077A0F23C (ntdll.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x00000FB00188C508。
【问题讨论】:
-
因此您为
Stru1分配内存,将其转换为具有不同成员的Stru2*,并期望一切正常。? -
您已经分配了 sinRecv = Stru1(带有“new Stru1”),然后将指针转换为 Stru2。 “新”分配的 sizeof(Stru1),因此尝试取消指向 Stru2 的指针会超出分配的末尾。
-
Stru2* sro = (Stru2*)simRecv;-- 从这行代码中删除强制转换。现在仔细阅读the error you get from your compiler。同样的事情here。错误说明了什么?那么你听过你的编译器吗?不,您继续并应用了强制转换来“关闭编译器”。