2014-11-08 48 views
0

我的節點包含一個int和一個字符串變量,並且我嘗試使用二叉搜索樹。代碼如下:初始化二叉搜索樹中的字符串數組

struct node{ 
int a; 
string members[5]; 
}; 

int main(){ 
node * root = NULL; 
root = (node*)malloc(sizeof(node)); 
root->members[0] = "aaaaa"; 
return 0; 
} 
當然

,我的代碼是不完全一樣的,我把它短主要是因爲我想只顯示問題。它給了我'訪問衝突寫入位置'。我嘗試使用'新節點();'而不是malloc,那沒有發生。爲什麼這是完全的?

回答

1

malloc()只分配內存。它不調用對象的構造函數。您可以使用例如分配的內存來調用構造函數。

void* mem = malloc(sizeof(node)); 
if (mem) { 
    node* root = new(mem) node; 
    // ... 
} 

當使用new node代替malloc(sizeof(node)的分配存儲器也被初始化。使用未初始化的對象是未定義的行爲。

+0

我現在明白了:D所以問題出在那裏,因爲string是一個類。我忽略了一個重要的事實在這裏哈哈。謝謝:D – Rei 2014-11-08 02:50:57

+0

@Rei:實際上,從概念上講,C++中的所有對象都需要用'new'來構造。對於某些類型(POD),它也可以分配內存,但是這些對象的新屬性並沒有什麼錯,實際上這比使用'malloc()'簡單。 – 2014-11-08 02:54:14

1

malloc只分配原始存儲。 new分配原始存儲將其初始化爲包含指定的類型。

如果您只分配POD類型,那麼區別主要是措辭之一,在發生的情況中幾乎沒有真正的區別。

如果你正在分配一個類似std::string的東西,它有一個構造函數,但它有一個世界的不同。如果你使用new,那麼你的string變量都已經被初始化,所以它們是真實的(儘管仍然是空的)字符串。當你只使用malloc時,它們根本沒有被初始化 - 它們只是大塊的未初始化的原始存儲,正確的大小包含一個string。當你嘗試把它們當作一個字符串使用時,一個快速崩潰就是你所希望的最好的。