2012-04-06 4 views
0

Я пытаюсь динамически выделять новый объект.C++ Memory Allocation new [] и delete []

int len = (nm == NULL) ? 0 : strlen(nm); 

try { 
    name = new char[len + 1]; 
} 
catch(std::bad_alloc) { 
    name = NULL; 
} 
if(name) { 
    if(nm == NULL) 
     strcpy(name, ""); 
    else 
    { 
     strcpy(name, nm); 
     cmds=new command [num_of_cmds]; 

Тогда мой деструктор имеет их удаление с помощью

robot::~robot() 
{ 
if (name) { 
    delete[] name; 
} 
delete [] cmds; 
} 

Я постоянно получаю ошибки segementation, если я изменить код, чтобы инициализировать значение на простой междунаре, он ломается. Мое удаление [] cmds ломается, поэтому я должен прокомментировать это. Любая помощь будет принята с благодарностью. Я буду разъяснять больше вещей, если люди нуждаются.

+2

Опубликовать небольшой самокомпилируемый пример, который демонстрирует вашу проблему. Заметьте, что, глядя на ваш код, есть много возможностей для его улучшения. Также этот пример, как и не будет компилироваться, я подозреваю, что это * код нет * оригинал * код. –

+0

Я уверен, что видел этот код два дня назад. Http://stackoverflow.com/questions/10001614/c-vector-arrays-in-copy-constructors –

+1

@amit: Хотя код совершенно катастрофический, я не знаю 'см. 'cmds' объявляется где угодно. Я вижу только его выделение, которое не указывает, является ли он членом или нет. –

ответ

1

Когда имя вашего робота»является NULL (nm == NULL), вы Alloc пустую строку, но делать не Alloc cmds. Таким образом, вы должны по крайней мере установить cmds в NULL в этой ветке или проверить деструктор if (name && *name != 0) до delete [] cmds;. Я бы с первым вариантом ...

0

Если у вас есть очень веские причины не делать, вы должны избегать использования new[] и delete[] и вместо того, чтобы использовать std::string и std::vector. Эти ручки управления памятью для вас; и из-за этого их значительно легче использовать.

std::vector гораздо полезнее, чем буфер, назначенный вручную, а не только потому, что он обрабатывает память для вас, но по-прежнему совместим со старыми API-интерфейсами C-стиля. В ситуациях, когда вам необходимо предоставить const char * или char *, вы можете просто предоставить &vec[0] (как в, адрес первого элемента std::vector).

std::string делает управление памятью, манипуляции со строками, и (в сочетании с std::stringstream) строки форматирования много, много, много проще. Не испытывайте соблазнов самостоятельно справляться с управлением памятью, используйте хорошо протестированные std::string и std::vector.