2012-02-10 16 views
1

当试图删除/释放字符ptr而不被strtok_r完全处理时,它给我堆栈跟踪错误。在处理完整字符串之前释放/删除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++; 
} 
+2

你可以请张贴一些实际的代码?试图猜测只是很痛苦。 – Useless 2012-02-10 10:58:35

回答

4

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

char *data, *freedata; 

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

// do yer stuffz here 

delete[] freedata; 
2

传递给strtok_r在第三个参数应该是一个不同的指针要分隔字符串的内容。尝试:

char *context; 

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

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

我不相信你需要你在传递前初始化它

0

的唯一指针,你可能永远free是那些由malloc获得,或者从那些获得。指定的函数返回一个指向内存的指针,“好像”由malloc获得。 strtok_r不会返回指向字符串的指针,“好像通过malloc获取”一样,所以您不能在其上调用free。如果你阅读这个函数的规范,它会在你的输入字符串中返回一个指向字符的指针,这个字符串可能被修改为用一个空终止符来打断分隔符。