2013-07-17 3 views
2

У меня есть следующий фрагмент кода:динамически выделенных строк массива не удалось освобождаться

string * p = new string[8]; 
cout<<sizeof(p)<<endl; 
free(p); 

, который, кажется нормально для меня, но не удалось с:

8 
a.out(85837) malloc: *** error for object 0x7fb5b3403ae8: pointer being freed was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

Другой тест на целочисленный массив работал. Есть ли что-нибудь особенное с строкой C++?

+4

Не читайте всю главу в этом руководстве? Нехорошо. –

+0

@KerrekSB. –

+8

Вы пишете 'std :: vector (8)' неправильно. – Casey

ответ

11

Yap. new [] пары с delete []. free() ing вызывает неопределенное поведение.

+0

А, мой плохой. Это кажется свободным парам с новыми для встроенных типов. –

+9

@HailiangZhang Нет, это не так. 'new' пары с' delete', 'new []' пары с 'delete []' и 'malloc()', 'calloc()' и 'realloc()' pair with 'free()'. Любая другая комбинация ошибочна. –

+2

Кроме того, из вашего кода мне кажется, что вы ожидаете, что оператор 'sizeof' даст 8. Вероятно, он не будет (если вам не удастся использовать 64-битную систему). [Это почему.] (Http://c-faq.com/aryptr/index.html) –

12

Прежде всего, когда вы используете new, вам необходимо использовать delete, а не free(). На самом деле, вы никогда не должны использовать free() или malloc() в C++. Хорошее объяснение, почему вы никогда не должны смешивать new и free или malloc() и удалить, что new и delete вызов конструктора и деструктора, free() и malloc() не имеют ничего общего с тем, что они просто выделить и освобождать память, особенно для встроенных в классах этой плохо, потому что вы не знаете, что должно произойти в деструкторе или конструкторе std::string, возможно, это будет возможно, чтобы он работал с вашим собственным встроенным классом (но не делайте этого).

Вы можете заменить свой код с этим:

string * p = new string[8]; 
cout<<sizeof(p)<<endl; 
delete [] p; 

В конце концов, я хотел бы предложить вам использовать встроенный тип данных, как std::vector или std::array. Они намного больше C++ - ish, чем стандартный старый массив C.

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