2012-04-19 18 views
0

"malloc"を使用してメモリを割り当て、 "free"を使用してメモリを割り当てないサンプルプログラムを試しています... "new"そしてセグメンテーション違反私は 'free'を使用してメモリを解放しています

class Object{ 
    public: 
     Object(){ 
      this->def = 10; 
      std::cout<<"Object Constructed"<<std::endl; 
     } 
     ~Object(){ 
      std::cout<<"Object Destructed"<<std::endl; 
     } 
     void amIPresent(){ 
       std::cout<<"Yes Object is Present, Defaulter is "<<this->def<<std::endl; 
      } 
    private: 
     int def; 
}; 


int main(){ 
    std::cout<<"Using malloc to Construct Object"<<std::endl; 
    Object *o = static_cast<Object*>(malloc(sizeof(Object))); 
    Object o2; 
    o = &o2; 
    std::cout<<"Freeing Memory using \"free\""<<std::endl; 
     o->amIPresent(); 
     free(o); 
     return 0; 
} 

...私はクラッシュ「セグメンテーション違反」を取得するが、私はなぜ理解できませんでした....適切な方法は、しかし、私は理解したいされ

を「削除」出力:

Using malloc to Construct Object 
Object Constructed 
Freeing Memory using "free" 
Yes Object is Present, Defaulter is 10 
Segmentation fault 
+0

あなたは 'malloc'でオブジェクトを決して割り当ててはいけません!コンストラクタを呼び出さないことは、問題の最初の部分に過ぎません。新しいオブジェクトを動的に作成したい場合は、 'new'を使います。 –

+0

また、将来的にセグメンテーションフォールトやその他のクラッシュなどが発生した場合は、まずデバッガを使用して何が起こるかを調べ、変数を調べる必要があります。あなたがすべてのステートメントを踏んで、各ステップで「o」を印刷すると、問題がはっきりとわかるはずです。 –

答えて

4

ベタスe を、mallocで作成されていないオブジェクトを指すように再割り当てしています。したがって、freeを呼び出すことは意味がありません。

2

oを解放すると、(変数として)スタックに割り当てられたo2のアドレスを指します。スタックオブジェクトにはfreeを使用しないでください。

+0

が同意しているので、私のケース「02」で削除(stackMemory)すると、セグメント違反が発生します。 –

0

私はあなたがこのコードがどのように機能するかを誤解だと思う:

Object *o = static_cast<Object*>(malloc(sizeof(Object))); 
Object o2; 
o = &o2; 

まず

Object *o = static_cast<Object*>(malloc(sizeof(Object))); 

は、ヒープ上のメモリの一部を割り当てますし、変数oは、それを指すようになります。

Object o2; 

はスタックにオブジェクトを作成します(スタックに割り当てられ、コンストラクタが呼び出されます)。

o = &o2; 

は、スタック上のそのオブジェクトにOポイントを行います、それはもはやあなたがmallocを使用してヒープに割り当てられたメモリを参照しません。あなたは

free(o); 

を使用する場合

だから、あなたがクラッシュして、スタックではなく、あなたがmallocを使用して割り当てられたメモリ上のメモリを解放しようとします。

新しいプレースメントを調べる必要があります。私はあなたのロジックはそうすることにしてであるかわからないんだけど、あなたはヒープ上にいくつかのスペースを割り当てるポインタoを宣言したが、その後、あなたは、スタックベースのオブジェクトo2時点にそれを再割り当て例What uses are there for "placement new"?

+0

次は、mallocとplacement newを使用した別の例です:http://stackoverflow.com/questions/7960556/using-placement-new-malloc-and-free – BertR

0

を参照してくださいあなたはメモリリークを引き起こしてしまったのです。

次に、o2に関連付けられたメモリを解放します。次に、 'o2'が破棄されます。すべてのスタックベースの変数は、そのスコープを終了すると自動的に解放され、すでに解放されているメモリを解放しようとします。

ここでの問題は、スタックとヒープベースのオブジェクトを混在させることです。スタック上に作成されたオブジェクトを削除(または解放)しようとしないでください。他にも述べたように、C++では新しいオブジェクトを使用し、ヒープベースのオブジェクトのみを削除します。

関連する問題