2012-04-06 16 views
-4

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

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

クラスの完全な定義が表示されていないため、言うことは難しいです。 http://sscce.orgを読んでください。最も可能性の高い説明は 'symbol'は有効なポインタではないということです。 –

+0

コンストラクタはどのように見えますか? –

+0

あなたはどのようにしてシンボルのためにメモリを割り当てて成長しましたか? – Haatschii

答えて

5

std::stringを使用してください。

それが明らかでない場合には、問題が処理されます。

また、同様の問題を回避し、問題の詳細をもう少し理解するためには、3のルールを参照するか、C++ 11のルール5を参照してください。

0

メモリの問題は、プログラムが常にすぐにクラッシュするとは限らないため、非常に扱いにくいことがあります。たとえば、同じポインタを2回削除すると、プログラムがクラッシュする場所を削除するまで、プログラムは正常に続行されます。もしあなたがLinux上で走っているならば、valgrindを実行することをお勧めします(例えばvalgrindの後に通常のコマンドが続くと仮定します)。他の削除/解放文に問題がないか調べてみてください。また、num_of_smは妥当な値ですか?

+0

はい、妥当な値です。私はチェックのためにprintfを使いました。その数はわずか16です。 – user1318393

0

私がデストラクタを呼び出すと、セグメンテーションエラーが発生します。もしそうなら

あなたは(怒鳴る)

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

をテストコードをもしかして、私はこの問題は、あなたが二回のポインタを削除していると思います。 plan ::〜plan()で初めて、main()を離れるときに2番目のプランです。 したがって、plan ::〜plan()を呼び出さないでください。

そして、ルール3(またはルール5)、つまり、 を指定する必要があります。デストラクタを定義した場合、コピーコンストラクタと代入演算子を同時に定義する必要があります。

関連する問題