2013-11-20 101 views
0

我有我的代码这种结构。 “可编译”的部分代码:错误使用C++初始化结构

#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; 
} 

当我设置的所有parametrs(除了“字符串”) - 各方面都不错,工作。 但是当我尝试inizialize“串” parametr(或其他类型的,而不是这一点,前myClass的类型或其他别的类型的变量),我有错误

"Unhandled exception at 0x0FDEEAD0 (msvcr110d.dll) in ConsoleApplication1.exe: 
0xC0000005: Access violation when writing to the address 0xCDCDCDCD." 

我不明白,为什么好好尝试一下工作“defaultParams-> path = defaultPath”。有人可以解释吗?

+1

我敢打赌,一些美元:'work'是一个(非静态)局部变量... – 2013-11-20 18:53:44

+0

此外,IDK多少,可能是有问题的,但'的malloc()'不会用C很好地工作++,它不会调用构造函数。因此,一个简单的无辜的任务可能会导致您的程序尝试释放垃圾... – 2013-11-20 18:57:47

+0

此外,向我们展示一些实际上失败的可编译代码。这个问题太过于抽象了。 –

回答

0

您使用与C++类STD一个结构的malloc:在它

malloc的字符串一无所知构造使您的字符串不会被初始化。

而是使用新/删除,并避免使用malloc /免费在你的C++程序

params* defaultParams = new params; 

或最好

std::unique_ptr<params> defaultParams(new params); 
+0

是的!使用'新'解决我的问题!非常感谢! =) –

0

在这里您使用Registry类OBJ其初始化值第二OBJ, 你不能没有使用赋值运算符重载初始化OBJ。 首先你应该重载分配。

1

我觉得有可能是坏了的malloc。因为malloc只是为对象分配一些内存。 代码中的字符串可能超出了您分配的内存边界。所以存在访问冲突。

尝试使用新的代替的malloc。

+0

谢谢!你的建议也非常有用 –