所以,最近我一直在为这个运行时错误而烦恼,我运行这段代码。这是一个客户端/服务器应用程序,客户端是一个注入(inject)到另一个进程地址空间的 DLL,而服务器是一个经典的独立程序。这是有罪的代码(我删除了文件中不相关的部分):
#include "TableInfo.h"
TableInfo::TableInfo(tstring id) {
this->id = id;
}
TableInfo::TableInfo(int num, tstring id) {
//this->num = num;
this->id = id;
}
void TableInfo::dump() {
//tcout << "num = " << this->num << endl;
tcout << "id = " << this->id << endl;
}
如您所见,我有两个构造函数,但除了签名外,它们实际上是相同的。 TableInfo
应该包含一些信息,这些信息稍后将嵌入到我试图通过 TPC 套接字从客户端发送到服务器的另一个对象中。我是这样做的:
TableInfo tt(999, L"MEGAOHM"); // WORKS!
//TableInfo tt(L"MEGAHOM2"); // DOESN'T WORK!
IpcRequest rr(CBE_NEW_TABLE);
rr.setTableInfo(tt);
c.sendRq(rr);
所以,IpcRequest
类只是另一个包含 TableInfo
实例和一些其他变量的类,它将被发送到服务器。 sendRq
函数将整个对象发送到我尝试显示其中包含的数据的服务器。正如您从代码中看到的那样,如果我调用 2 个参数构造函数,它会工作,否则我会收到内存访问冲突错误。根据调试器,当我尝试访问 id 字段时,错误发生在 TableInfo
内的 dump
函数中。
我真的不知道这可能与什么有关,当然我仍然可以使用带有 2 个或更多参数的构造函数,问题就消失了,但我想知道这怎么可能。
PS:tstring
只是我定义的一个宏,它根据 UNICODE 设置解析为 wstring 或 string。
最佳答案
通常在这种情况下,问题是内存在程序的某处被破坏了。因为它是一个 DLL,所以我想你的操作系统是 Windows。所以你可以使用免费工具Application Verifier .只需将Protect Heap Structures 选项设置为开即可。它可以帮助您找到导致内存损坏的代码。
关于如果我向类构造函数添加一个伪参数,C++ 内存访问冲突神秘地消失了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7083529/