2014-11-08 5 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; 
} 

конечно, мой код был не совсем так, я сделал это короткое замыкание в основном, потому что я хочу показать только эту проблему. он дал мне «место записи нарушения прав доступа». Я попытался использовать 'new node();' вместо malloc, и этого не произошло. почему это точно?

ответ

1

malloc() выделяет память. Он не вызывает конструктор объекта. Вы можете вызвать конструктор в выделенной памяти, используя, например,

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

При использовании new node вместо malloc(sizeof(node) выделить память также инициализируется. Использование неинициализированного объекта - это неопределенное поведение.

+0

Я получаю его сейчас: D, поэтому проблема в том, что строка - это класс. Я упустил из виду важный факт здесь. спасибо: D – Rei

+0

@Rei: на самом деле, концептуально все объекты в C++ должны быть построены с помощью 'new'. Для определенных типов (POD) он также работает, чтобы просто выделить память, но нет ничего неправильного 'new'ing этих объектов, и сделать это на самом деле проще, чем использование' malloc() '. –

1

malloc только выделяет необработанное хранилище. new выделяет необработанное хранилище и инициализирует его, чтобы он содержал указанный тип.

Если вы выделяете только типы POD, это различие в основном относится к формулировке, с небольшим количеством реальных различий в том, что происходит.

Если вы выделяете что-то вроде std::string, у которого есть конструктор, есть мир различий. Если вы используете new, тогда все переменные string были инициализированы, поэтому они являются настоящими (хотя и пустыми) строками. Когда вы просто используете malloc, они не были инициализированы вообще - они всего лишь куски неинициализированного необработанного хранилища нужного размера, чтобы содержать string. Когда вы пытаетесь использовать их как строку, быстрый крах - это лучшее, на что вы можете надеяться.

Смежные вопросы