2011-02-07 7 views
1

deleteはfree()関数を使用し、値を変更するだけで新しいノードは作成しないため、削除するとは思いません。私はJavaから来ているので私は尋ねている、私はメモリ割り当てに新しいです。C - これらの関数はガベージを生成しますか?

IntNodePtr delete(int i, IntNodePtr p) { 
    /* End of list check */ 
    if(p == NULL) 
    return NULL; 

    /* Check if current node is the one to delete */ 
    if(p->myInt == i) { 
    IntNodePtr temp; 
    temp = p->next; 

    free(p); 
    return temp; 
    } 

    p->next = delete(i, p->next); 
    return p; 
} 

IntNodePtr replace(int i, int j, IntNodePtr p) { 
    if(p == NULL) 
    return NULL; 

    if(p->myInt == i) 
    p->myInt = j; 

    p->next = replace(i, j, p->next); 
    return p; 
} 
+1

どのように両方の方法を使用したかを考えれば、私にとってはうまく見えます。 –

+0

C言語で関数 'delete'を呼び出すことは正当ですが、C++コードから呼び出せるように、別の名前(' delete_node'など)に名前を変更することを強くお勧めします。 –

答えて

-2

Cでは、freeが呼び出されたときに「ガベージ」が生成されますが、Cでは「ガベージコレクション」はありません。それが実行されていない限り、私が明白なことを述べていれば賢い!だから、削除は "ガベージ"を生成します - あなたの観測を置き換えることに関しては正しいです。

+0

'free'はどのようにゴミを生成しますか?私は、不正確ではないにしても、全く役に立たないため、これをdownvoteするように誘惑されています。 –

+0

-1:私は2分以上この答えを見つめていましたが、まだ理解していません。ガベージ(メモリリーク)は 'free'が**呼ばれていないときに生成されるものです。私はこの "answerer"が英語の上に良いグリップを持っているのだろうかと思っています。 – JimR

+0

私が答えようとしていることは、あなたがいったん 'フリー'になると、そのメモリの内容は不確定であり、オフ・リミットであるということです。 'free'コールの後にポインタがゴミを指していますか? (あなたがあなたの '自由な'の後にポインタを使うのであればそれは頼りにしているからです。) – user470379

1

Cでは、もはや使用されていない "ガベージ"ではなく、 "メモリリーク"と呼ばれる割り当て済みメモリを呼び出しません。

mallocを使用して、以前に割り当てたメモリはfreeである必要があります。この場合、あなたの関数のどれもmallocを呼び出さないので、何もfreeは必要ありません。 (それはプログラムのどこかに割り当てられたfree INGのメモリであるように。細かすぎることdelete機能が見えますけど。)

+1

C APIはオーナーシップの問題でも不規則であることはよく知られています。彼は、直接呼び出されたAPIが動的に割り当てられたメモリを返すため、メモリを直接割り当てることはできません。 –

+0

"それで、彼らは何も解放する必要はありません"と私はdownvoteに誘惑しています。 – Potatoswatter

1

deleteであなたはfreeオブジェクトのポインタを交換した後に、アクセスする方法はないでしょう、ので、それ。すべての良いそこに。

replaceオブジェクトは変更されています。何も作成または破棄されないので、およびfreeは関与しません。

リストが長すぎると、これらの関数によってスタックオーバーフローエラーが発生することがあります。また、replaceは常にその引数pを返しますので、何も返す必要はありません。 p->next = replace(…の代わりに関数の終わりにテールコールを残すと、スタックオーバーフローのリスクが(すべてではなく)排除されます。ループとしてのdeleteのコード化も同様におそらく幾分安全です。

+0

再帰の削除に同意します。再帰関数のために再帰関数を記述しないでください。この特定のプログラムでは、次の2つのことを行います.1)コードを大幅に遅くする、2)読みにくくする。 – Lundin

0
if(p->myInt == i) { 
    IntNodePtr temp; 
    temp = p->next; 

    free(p); 
    return temp; 
    } 

このコードは疑わしいです。あなたは返されたポインタで何をしますか?私には、前の "次のポインタ"を気にせずに、リンクされたリストの途中にあるノードを削除したようです。 pが削除されると、前の次のポインタは無効なメモリを指します。私。あなたは真ん中のリストを切り捨てます。

関連する問題