如果我向类构造函数添加一个伪参数,C++ 内存访问冲突神秘地消失了

标签 c++ memory

所以,最近我一直在为这个运行时错误而烦恼,我运行这段代码。这是一个客户端/服务器应用程序,客户端是一个注入(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/

相关文章:

c++ - 在 C++ 中返回后更改返回指针

使用#include<algorithm> 的 C++ 编译错误

Linux "free -m": Total, 已使用和可用内存值不加起来

java - 如何在 Java 中监控计算机的 CPU、内存和磁盘使用情况?

java - 非常大的堆大小,但使用的内存很小

c++ - FD_SET 问题/网络

c++ - 使用 LDAP 中的页面控制获取 Active Directory 组中的所有用户 ID - native api

C++ 结构值初始化

delphi - 如何从内存指针中一个元素一个元素地顺序读取数据?

matlab - 我可以删除占位符变量以节省 Matlab 中的内存吗?