2013-11-20 98 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

謝謝!你的建議也非常有用 –