2012-02-10 2 views
1

strtok_rで完全に処理されずに文字ptrを削除しようとすると、スタックトレースエラーが発生します。完全な文字列を処理する前にstrtok_rポインタを解放/削除しますか?

strtok_r funcで文字列分離処理全体を完了することなく、通常の方法でstrtok_r char ptrを解放/削除することはできません。

誰も私のチャット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

答えて

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によって得られた "if"のようなメモリへのポインタを返すように指定された関数。 strtok_rは、 "mallocで取得されたように"文字列へのポインタを返しません。そのため、freeを呼び出すことはできません。この関数の仕様を読んだ場合、入力文字列の文字へのポインタが返されます。このポインタは、NULL終端文字を持つセパレータを壊すように変更されている可能性があります。

関連する問題