C ++中的初始化结构出错

时间:2013-11-20 18:47:49

标签: c++ struct structure

我的代码中有这个结构。 “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”。谁能解释一下?

3 个答案:

答案 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);