我的代码中有这个结构。 “Compilable”代码的一部分:
#define MONITOR_TOPKEY HKEY_LOCAL_MACHINE
#define MONITOR_SUBKEY TEXT("SOFTWARE\\WMyRegistry")
struct params {
HKEY hMainKey;
LPTSTR hSubKey;
string path;
bool* runflg;
};
void _tmain(void) {
bool work = true;
string defaultPath = "HKEY_LOCAL_MACHINE";
defaultPath += "\\";
defaultPath += MONITOR_SUBKEY;
params* defaultParams = (params*) malloc(sizeof (params));
defaultParams->hMainKey = MONITOR_TOPKEY;
defaultParams->hSubKey = MONITOR_SUBKEY;
defaultParams->path = defaultPath; // HERE THERE IS A PROBLEM
defaultParams->runflg = &work;
}
当我设置所有参数(“字符串”除外)时 - 一切都很好并正常工作。 但是当我尝试使用'string'参数(或其他类型而不是这个,对于ex myClass类型或其他类型变量)时,我有错误
"Unhandled exception at 0x0FDEEAD0 (msvcr110d.dll) in ConsoleApplication1.exe:
0xC0000005: Access violation when writing to the address 0xCDCDCDCD."
我不明白,为什么不能正常工作“defaultParams-> path = defaultPath”。谁能解释一下?
答案 0 :(得分:1)
我认为malloc可能有问题。因为malloc只为对象分配一些内存。 代码中的字符串可能会超出您分配的内存的边界。因此存在访问冲突。
尝试使用new而不是malloc。
答案 1 :(得分:0)
这里你使用一个注册表类obj初始化值第二个obj, 你不能在不使用赋值运算符重载的情况下初始化obj。 首先你应该重载分配。
答案 2 :(得分:0)
您在结构中使用malloc,其中包含C ++类 std:string
malloc对构造函数一无所知,因此不会初始化字符串。
改为使用new / delete并避免在C ++程序中使用malloc / free
params* defaultParams = new params;
或者最好
std::unique_ptr<params> defaultParams(new params);