Освободить / удалить указатель strtok_r перед обработкой полной строки? - PullRequest
1 голос
/ 10 февраля 2012

При попытке удалить / освободить ptr символа без полной обработки с помощью strtok_r, это дает мне ошибку трассировки стека.

Я знаю, что невозможно удалить / удалить strtok_r char ptr в обычномКстати, без завершения всего процесса разделения строк с помощью strtok_r func.

Может кто-нибудь сказать мне, как освободить char ptr, когда он обрабатывается strtok_r?

 char *data = new char[temp->size()+1];//temp is of type string
 copy(temp->begin(),temp->end(),data);
 data[temp->size()]='\0';

 count = 0;

while(pointData != NULL)
{
if(count == 0)
pointData = strtok_r(data,":",&data);

else
pointData = strtok_r(NULL,":",&data);

if(count == 5)//some condition to free data
delete[] data;// this produces stack trace error

cout<<pointdata<<endl;

count++;
}

Ответы [ 3 ]

4 голосов
/ 10 февраля 2012

Поскольку strtok_r продвигает «данные» по ходу дела, это означает, что он больше не указывает на адрес распределения; вам нужно сохранить указатель "freedata" или что-то подобное:

char *data, *freedata;

freedata = data = new char[temp->size()+1];

// do yer stuffz here

delete[] freedata;
2 голосов
/ 10 февраля 2012

Контекст, передаваемый strtok_r в третьем аргументе, должен быть другим указателем на строку, которую вы хотите разделить.Попробуйте:

char *context;

....
pointData = strtok_r(data,":",&context);

else
pointData = strtok_r(NULL,":",&context);

Не думаю, что вам нужно инициализировать его, прежде чем передать его.

0 голосов
/ 10 февраля 2012

Единственные указатели, которые вы можете когда-либо передавать на free, это те, которые получены с помощью malloc, или те, которые получены из функций, которые определены для возврата указателя на память "как будто", полученного с помощью malloc.strtok_r не возвращает указатель на строку «как если бы она была получена с помощью malloc», поэтому вы не можете вызвать free для нее.Если вы прочитаете спецификацию для этой функции, она вернет указатель на символ во входной строке, который был потенциально изменен, чтобы заглушить разделитель нулевым терминатором.

...