在处理完整的字符串之前释放/删除strtok_r指针?

时间:2012-02-10 10:55:36

标签: c++ stack-trace free strtok delete-operator

尝试删除/释放字符ptr而未被strtok_r完全处理时,它会给我堆栈跟踪错误。

我知道无法通过strtok_r func完成整个字符串分隔过程,无法以常规方式释放/删除strtok_r字符ptr。

任何人都可以告诉我如何在strtok_r进行处理时释放char ptr?

 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 个答案:

答案 0 :(得分:4)

因为strtok_r正在推进“数据”,这意味着它不再指向分配的地址;你需要保持一个“freedata”指针等:

char *data, *freedata;

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

// do yer stuffz here

delete[] freedata;

答案 1 :(得分:2)

在第三个参数中传递给strtok_r的上下文应该是指向要分隔的字符串的不同指针。尝试:

char *context;

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

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

我认为你无需在传入之前对其进行初始化。

答案 2 :(得分:0)

永远传递给free的唯一指针是malloc获得的指针,或者从指定返回指向内存的指针的函数中获取的指针“就好像“由malloc获得。 strtok_r不会返回指向字符串的指针,“就好像malloc”一样,因此您不能在其上调用free。如果您阅读了此函数的规范,它将返回一个指向输入字符串中字符的指针,该指针可能已被修改为使用空终止符来破坏分隔符。