-2

私はCでのメモリ管理について学んでいます。

malloc経由でサイズ設定する構造体へのポインタがあります

some_struct *mystruct = malloc(sizeof(some_struct));

後でfreeその構造体で使用します。

この構造体の中には3つのchar *ポインターがあります。私も彼らの記憶をmallocします。

解放する前にそれらのメモリも解放する必要がありますか、それとも構造体内のメモリを*mystruct破壊すると解放されますか?*mystruct

4

4 に答える 4

5

構造体内のchar*ポインタが指すメモリも絶対に解放する必要があります。最初にそれを行い、次に構造体を解放します

ただし、構造体内のchar *ポインターを解放しないでください。他の場所で、それらのchar *ポインターの同じメモリをポイントしている場合(つまり、構造体を別の構造体インスタンスにコピーした場合、それらのchar*ポインターは有効なものを指す必要があります。メモリー)。

于 2012-12-23T17:37:06.377 に答える
3

魔法もサンタクロースもありません。あなたは自分で仕事をしなければなりません。動的に割り当てたすべてのメモリを、見失う前に解放します。

于 2012-12-23T17:35:57.760 に答える
0

これが、後でc ++に変更したい理由です。そうすれば、それを独自に実行する構造体を作成できます(適切なコードをデストラクタに配置した場合)。Cでは、自分で作業を行う必要があります。つまり、構造体を削除する前に、構造体内のものを削除します。そしてもちろん、構造体をmallocするときは、構造体内のメンバーを適切に初期化する必要があります。最小でポインターを0に初期化して、削除時にグリッチが発生しないようにします...

于 2012-12-23T17:44:18.257 に答える
0

グッドプラクティスに関しては、割り当てたものをすべて解放し、htmlタグを開いて閉じるように考えてください。グッドプラクティスに関しては、C++またはC++のクラスのように構造体について考えないことをお勧めします。 java。

構造体を解放すると、オブジェクト自体ではなく、オブジェクトへのポインタのみが解放されます。

#include <stdio.h>                                                                                                                                                                   
                                                                                                                                                                               
typedef struct                                                                                                                                                                       
{                                                                                                                                                                                    
    int a,b,c,d;                                                                                                                                                                     
    char some_string[1050];                                                                                                                                                          
                                                                                                                                                                                     
} first_type;                                                                                                                                                                        
typedef struct                                                                                                                                                                       
{                                                                                                                                                                                    
    struct first_type *ap;                                                                                                                                                           
} second_type;                                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                    
int main(void)                                                                                                                                                                       
{                                                                                                                                                                                    
    printf("first type: %d\n", sizeof(first_type));                                                                                                                                  
    printf("second type: %d\n", sizeof(second_type));                                                                                                                                
}          

この小さな例を実行すると、次のようなものが表示されます

最初のタイプ:1068

2番目のタイプ:8

second_typeそれへのポインタがありますが、そのfirst_typeサイズは。よりかなり小さいですfirst_type。したがって、mallocを実行してコンテンツを解放すると、そのデータ型がメモリ内にあるバイト数を予約および解放するだけになります。

お役に立てれば。

于 2012-12-23T18:15:17.620 に答える