0

「malloc」を使用してメモリを割り当て、「free」を使用してメモリの割り当てを解除するサンプルプログラムを試しています...「new」と「delete」を使用するのが適切な方法であるという事実を認識していますが、理解するために....

「セグメンテーション違反」というクラッシュが発生しますが、理由がわかりませんでした...

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
4

4 に答える 4

4

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

于 2012-04-19T12:58:18.970 に答える
2

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

于 2012-04-19T12:59:15.417 に答える
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 を使用して割り当てたメモリではなく、スタック上のメモリを解放しようとするため、クラッシュします。

新しい配置を検討する必要があります。たとえば、「placement new」にはどのような用途がありますか? を参照してください。

于 2012-04-19T13:08:30.557 に答える
0

ヒープにスペースを割り当てるポインターoを宣言しましたが、それを再割り当てしてスタックベースのオブジェクトを指すようにしましたo2。ロジックが何をしているのかわかりません。そうすることで、メモリリークが発生しました。

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

ここでの問題は、スタック ベースとヒープ ベースのオブジェクトが混在していることです。スタック上に作成されたオブジェクトを削除 (または解放) しようとしないでください。他の人が言ったように、C++ ではヒープベースのオブジェクト専用に new と delete を使用してください。

于 2012-04-19T13:17:40.943 に答える