2014-02-13 2 views
1
int nSize; 
QString str; 
char *p = new char[nSize]; 
p = str.toLocal8bit.data(); 
delete[] p; 

У меня была ошибка отладки, когда я попытался удалить массив символов в Xcode 5.0.2, но этот массив символов успешно удален в Xcode 3.0.2.Как удалить массив char * на mac osx с помощью xcode?

+0

Вы намеренно с помощью C++? Лучше всего пометить язык тегом в таком вопросе. – zaph

+0

Я не понимаю, почему вы будете делать такие вещи, как использование 'QString', копировать его содержимое в' char * 'и обрабатывать эту память, когда начальная' QString' будет иметь дело с этим для вас. Если какой-то funciton нуждается в 'char *', то используйте 'QString :: toLocal8Bit()', и вам должно быть хорошо идти – Zaiborg

ответ

3

Линия

p = str.toLocal8bit.data(); 

переписывает указатель, который вы получили от new. Когда вы удаляете p, вы удаляете память, которую вы не контролируете.

Если вам действительно нужна копия строковых данных, вы можете использовать memcpy или strcpy для копирования из строки в ваш массив (вместо назначения).

Если вы на самом деле не нужна копия, вы можете сделать:

const char* p = str.toLocal8bit.data(); 
7

Если это удалено успешно в любом месте, это ошибка.

char* p = new char[nSize]; 

Пока все хорошо. p - массив символов.

p = str.toLocal8bit.data(); 

p теперь указывает на (предположительно) некоторые базовые данные из str.toLocal8bit. Теперь у вас нет способа ссылаться на только что выделенную память.

delete[] p; 

Теперь вы удалили память другого объекта.

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