-4

メモリを割り当てましたが、デストラクタを呼び出すと、セグメンテーション違反が発生します。これがコードです。私はメモリを解放するために正しいものを使用していますか?

class plan {
    char *symbol;
    gro  *grow;
  public:
    plan (int, char[] ); //constructor
    ~plan ( ); //destructor
};

plan::plan (int num_of_sm, char sm[]){
  try {
    symbol = new char [strlen(sm) + 1];
  }
  catch (std::bad_alloc) {
    symbol = NULL;
  }


  if (symbol != NULL) {
    if (sm == NULL) {
      strcpy (symbol, "");
    }
    else {
      strcpy (symbol, sm);
    }
  }
  gro = new grow [num_of_sm]; 
}

plan::~plan( ){
  delete [ ] symbol;
  delete [ ] gro;
}
4

3 に答える 3

5

それを使用std::stringして実行します。

明らかでない場合に備えて、それで問題が解決します。

しかしまた、いくつかの同様の問題を回避し、関連する問題のもう少しを理解するために、3のルールを調べてください。C++ 11で知られているように、5のルールです。

于 2012-04-06T23:52:21.770 に答える
0

プログラムがすぐにクラッシュするとは限らないため、メモリの問題は非常に扱いにくい場合があります。たとえば、同じポインタを2回削除すると、後でクラッシュする場所を削除するまで、プログラムは問題なく続行される可能性があります。Linuxで実行している場合は、valgrindを実行することをお勧めします(インストールされていると仮定すると、valgrindと入力してから通常のコマンドを入力します。例valgrind myprog arg1 arg2

いずれにせよ、問題はプログラムがクラッシュする場所にあると思い込まないでください。他のdelete/freeステートメントに問題がないか調べてみてください。また、num_of_smが妥当な値であると確信していますか?

于 2012-04-07T01:45:13.253 に答える
0

デストラクタを呼び出すと、セグメンテーション違反が発生します。

テストコードのことですか(以下)

int main()
{
    plan a_plan(2, "hello");
    a_plan.~plan();
}

もしそうなら、問題はあなたがポインタを2回削除することだと思います。1回目はplan::〜plan()で、2回目はmain()を離れます。したがって、plan ::〜plan()を呼び出さないでください。

そして、ルール・オブ・スリー(またはルール・オブ・ファイブ)に従う必要があります。つまり、デストラクタを定義した場合は、コピーコンストラクタと割り当て演算子を同時に定義する必要があります。

于 2012-04-07T02:48:19.587 に答える