2015-01-30 2 views
-4

Я относительно новичок в C++. Мой код считывает тысячи изображений и выполняет обработку изображений. Я хочу прочитать сырое изображение в функции, поэтому я передаю строку с ее именем в функцию, а затем создаю постоянный массив символов (до тех пор, пока мне нужен const char для fopen). В конце функции я хочу удалить его. Но это исключение я не могу исправить:Как удалить массив const в C++

extern "C" void imreadTIFF(string location, int x, int y){ 
    const char * c = location.c_str(); 
    <code> 
    delete [] c; 
} 


Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 

Я знаю, что этот вопрос задавался много раз. Но я не нашел, как исправить свою проблему, также уже пробовал пару способов.

Спасибо, Михаил

+7

* Не удаляйте указатель, который вы получаете из 'c_str()'. – Borgleader

+0

Think (!): Временное расположение строки владеет памятью и все равно разрушается. (Соедините все новое с удалением, но не вводите лишнее удаление) –

+0

btw, откуда вы знаете? «Я знаю, что этот вопрос задавали много раз». –

ответ

6

std::string::c_str возвращает указатель на внутренний char массиве string. Пользователь не должен быть удален пользователем, так как сам объект string будет управлять своим ресурсом.

Кроме того, если вы не намерены изменять string, передайте его как const string&. Если вы действительно изменяете объект string, имейте в виду, что некоторые операции с string s аннулируют указатель .c_str().

+1

Итак, после того, как функция будет закончена, этот указатель будет удален автоматически? Спасибо –

+1

Да, это точка использования строкового объекта вместо необработанного указателя на char. – Dabbler

+1

@MikhailGenkin Память, о которой мы говорим, будет освобождена деструктором 'string', как только закончится срок существования объекта' string'. Вам ничего не нужно делать вручную. –

1

Поскольку вы не использовали new[], вы не должны использовать delete[]. Программа автоматически удалит его.

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