2013-04-14 31 views
1

正如標題所示,我試圖將值插入到對象指針的字符串中。C++:在對象指針中爲字符串賦值時的第一次機會異常

在我的頭,我的目標看起來如下:(它在處理與好奇建模文件和目錄系統分配)

typedef struct d_tree 
{ 
std::string name; 
d_tree *parent; 
std::vector<d_tree> dirs; 
std::vector<t_file> files; 
} tree_node; 

對於我的簡單起見,我使用字符串和向量(避免焦炭的細微差別*和雙指針數組)現在

,該目錄樹的頭,我有我的資料來源:

tree_node *G = (tree_node *)malloc(sizeof(tree_node)); 
getline(dirs, dirp); //First should be main parent, or ./ 
G->name = dirp; 
G->parent = NULL; 
tree_node *top = G; 
tree_node *curr = G; 

分配運行正常和良好,而函數getline僅供閱讀一些字符串數據,我會用......但一旦我打了G->name = ...,我的編譯器(使用VS 12)破口大罵:

" First-chance exception at 0x57AD11CE (msvcr110d.dll) in File_System.exe: 0xC0000005: 
Access violation writing location 0xCDCDCDCD. 

If there is a handler for this exception, the program may be safely continued. " 

在在引發異常之前查看局部變量,我注意到一些事情:G中的name變量在值列中有一個值。

父變量也似乎很奇怪,但我不會擔心它只是還沒有(特別是爲我做它NULL,反正..)

如何緩解這個問題任何意見(最好保持字符串,但可以理解,如果沒有光滑的解決方案存在)非常感激。

回答

2

您使用malloc分配非POD類型的structmalloc只分配內存,它不是構造分配的struct的非POD成員。因此,當您嘗試分配給該struct的非POD成員時,您正在調用垃圾對象上的每個成員類型的賦值運算符。

改爲使用new tree_node()。 (也可以用delete代替free來釋放內存,或者更好的是,假設你有一個沒有周期的真樹,使用智能指針爲你釋放內存。)

順便提一句,你不需要做

typedef struct tag { ... } typename; 

in C++;只是

struct typename { ... }; 

是等價的。

+0

而且一般來說,你會很難找到一種情況,在C++中'malloc'會比'new'更受歡迎。 –

+0

這似乎解決了這個問題。謝謝! –

2

您需要使用new來創建樹節點,以便調用name的構造函數來初始化它。

//tree_node *G = (tree_node *)malloc(sizeof(tree_node)); 
    tree_node *G = new tree_node; 

這應該工作。
雖然如果你真的需要用malloc分配內存出於某種原因,你可以使用新的位置。

void* gptr = malloc(sizeof(tree_node));//Allocate memory 
tree_node *G = new(gptr) tree_node;//construct object in allocated memory 
//Do whatever you want with G 
G->~tree_node();//Explicitly call destrutor 
free(gptr);//free memory 
+0

感謝您的反饋! –

相關問題