問題タブ [strdup]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - strdup によるリークを解放する方法は?
基本的に、このプログラムは行を読み取り、辞書順で出力します。
strdup(buffer) の使用がリークを引き起こしていることがわかりましたが、それを解放していません。
私が声明を出すとき
無料(tmp->アイテム)
、漏れの可能性がないことを示しています。しかし、それでは正しい出力が得られません。この漏れはどう対処すればいいですか?
c++ - Bison/Flex でメモリを解放する場所は?
私は Bison & Flex を 1 か月ほど使用しています。
Flex Bison でメモリを解放する際に問題があります。私のコードは次のようになります。
これは、私の .l ファイルの例の 1 つです。yytext の値を yylval.str にコピーします。次に、そのコンテンツ (実際にはキー/値) を使用して新しいペアを作成し、bison のトークン日付を返します。私のパーサー .y は yyparse 以下です。何かがキャッチされると、それを印刷するだけです。
これで valgrind を実行しようとしましたが、strdup に関して複数のエラーが発生しました。この関数が malloc を使用することは知っていますが、FREE を使用する場所と時期がわかりません。
おそらく.yファイルにあると思いますが、どこですか?
私はこれのすべてを本当に理解していません。単純で明確な説明をいただければ幸いです。
前もって感謝します、
編集:
次のようないくつかのことを試しました:
正常にコンパイルおよび実行されているように見えますが、valgrind は strdup 関数に含まれる malloc に問題があると私に言います。しかし、flex ファイル内に free(yylval.str) を書くことはできません。この漏れの問題を解決する方法が本当にわかりません。
c++ - 戻り値の型が char * の関数から strdup を返すリスクがありますか?
戻り値の型が char* である関数から strdup を返したい場合、メモリ リークのリスクまたは可能性は何ですか?
c++ - C++ リリースでは、char* が文字列に割り当てられました
私は答えを見つけようとしましたが、何も簡単に見ることができませんでした。
次のスニペット コードで割り当てられたメモリを解放するにはどうすればよいですか。
const char* attStr = strdup(OtherCharStr);
string str(attStr, strlen(attStr));
delete str; //???
c - C で basename/dirname の後に strdup ポインタを解放する必要がありますか?
basename
(GNU ではなく) POSIX の関数を使用したい。
マニュアルページから:
dirname() と basename() の両方がパスの内容を変更する可能性があるため、これらの関数のいずれかを呼び出すときにコピーを渡すことが望ましい場合があります。
これらの関数は、後続の呼び出しによって上書きされる可能性がある、静的に割り当てられたメモリへのポインターを返す場合があります。 または、関数によって返されるポインターが不要になるまで、 path によって参照される文字列を変更または解放しないように、path の一部へのポインターを返す場合があります。
また、次のようにも述べています。
戻り
値 dirname() と basename() は両方とも、NULL で終わる文字列へのポインタを返します。(これらのポインターを free (3) に渡さないでください。)
したがって、例は次のようなことを示唆しています。
例
( ) のstrdup
マニュアルstrndup
ページには次のように書かれています。
新しい文字列のメモリは malloc(3) で取得され、free(3) で解放できます。
問題は、dirc と basec を解放する必要があるか ( に従って)、解放しstrdup
ないか ( に従ってbasename
) かどうかです。
c - while ループ内の Free()
文字配列が作成され、メモリが動的に割り当てられるこのプログラムを実行しようとしています。その後、配列要素には、連続する 10 か所の文字列「hello」が入力されます。値は、strdup() 関数呼び出しを使用して文字列要素に割り当てられます。
すべての要素が割り当てられると、while ループで要素が解放されます。Visual Studio でプログラムを実行すると、char 配列への最後のポインターが解放された後にプログラムがクラッシュします。while ループの終了条件は正しいと思います。しかし、問題の原因を正確に特定することはできません。
コード:
c - strdup(): 警告について混乱しています (「暗黙の宣言」、「ポインタを作成します...キャストなし」、メモリ リーク)
以下の短いコード (文字列を定義し、strdup を使用してコピーを作成) をコンパイルすると、3 つの警告が表示されます。GCC からの 2 つのコンパイラ警告と、valgrind からの 1 つのランタイム警告/エラーです。
メモリ リーク エラー (valgrind によって報告された) も、strdup の使用に関連していると思われるため、関連する出力を以下に示します。
私は何を間違っていますか?(私はCの本を読んでいますが、これが著者によるstrdupの使用方法です。)
コード:
警告/出力:
memory-leaks - strdup での Valgrind メモリ リーク
私は小さなプロジェクトをやっています。ツール Valgrind を使用してメモリ リークをチェックしています。このツールを使用すると、次の情報が得られました。
これらは、関数 strdup を使用したコーディングです。LEXコードで使用しました。
どの時点でメモリがリークされたのかわかりません。
c - 「null以外が必要な場合にnull引数」というコンパイラ警告を回避する方法
次のコードをコンパイルします。
次のコンパイラ警告が発生します。
ただし、チェックが原因である場合はstrdup
呼び出されません。この警告を回避する方法はありますか?FOO
NULL
if (FOO)
ありがとう!