CおよびC++で返される動的メモリへのポインタを使用してメモリリークを処理するためのプロトコルについて疑問に思っていました。たとえば、strtokはchar*を返します。おそらく、返されるポインタは最終的に解放/削除する必要があります。リファレンスページにはこれについても触れられていないことに注意してください。これは単純に想定されているからですか?また、削除するか解放するかをどうやって知るのですか?各関数が元々どの言語であったかを調べるために調査を行い、すべてのCプログラムがmalloc / freeを使用し、C++がnew/ deleteを使用すると想定する必要がありますか?
3 に答える
strtokは、新しく割り当てられたメモリへのポインタではなく、以前に割り当てられたメモリ位置へのポインタを返します。
これを仮定しましょう:
char String[1024];
strcpy(String, "This is a string");
char *Ptr = strtok(String, " ");
Ptrは、新しく割り当てられたメモリの場所ではなく、文字列の場所を指します(カウントが今失敗しない場合)。スペースは「\0」に置き換えられます。((
参照から:トークンのこの終わりは、関数によって自動的にヌル文字に置き換えられ、トークンの始まりは関数によって返されます。
つまり、strtokの作業が完了した後で「文字列」を再度出力すると、文字列はその後終了するため、「これ」のみが含まれることになります。
経験則として、明示的に割り当てたメモリを解放/削除するだけでよいと言っても過言ではありません。
つまり、次のことを意味します。
'new'ごとに'delete'を配置し、'malloc'ごとに'free'を配置すれば問題ありません。
strtok
以前に割り当てられたメモリへのポインタを返すC関数です。strtok
それ自体は新しいメモリを割り当てません。
何かが割り当てられている場合は、 ;malloc
で解放する必要があります。newで割り当てられるものはすべて、 dでfree
ある必要があります。free
delete
最新のC++でメモリの割り当て/割り当て解除を処理する最良の方法は、スマートポインタを使用することです。std::shared_ptr
/を見て、std::unique_ptr
どうしても必要な場合を除いて、生のポインタを使用しないでください。
また、とを使用するstd::string
とstd::vector
、ほとんどの生のポインタが削除されます。
このstrtok
関数はメモリ割り当てを実行しません。それはあなたが提供した文字列ポインタに対してその操作を実行しています。関数が呼び出されるまでに、ヒープ上のポインタにメモリを割り当てるか、自動スタックストレージを使用するかをすでに考えているはずです。あなたは書くことができたでしょう:
char * p = "Testing - string";
char * p2 = strtok(p, "- ");
ここで、p2はスタックに割り当てられているため、解放/削除する必要はありません。しかし、ここで
char * p = "Testing - stringh";
char * p2 = malloc(strlen(p));
p2 = strtok(p, "- ");
ヒープ上のp2にストレージを割り当てたので、それを終了した後、ストレージを解放してnullに設定する必要があります。
if(p2 != NULL) {
free(p2);
p2 = NULL;
}
したがって、ヒープ割り当てにnewを使用している場合は、deleteを使用します。malloc / callocを使用した場合は、無料で使用する必要があります。