0

newとの経験則は何だろうと思っていましたdelete。に電話するたびnewdelete.

以下の場合、destructorしかし、を含めると、悪い超過エラーが発生します。を含めない場合destructor、私のコードは正常に動作します。

struct Foo
 {
     Foo(int A, int B)
     {
          bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);
          //creates a vector of A vectors where each nested vector contains the number 2 B times. 
     }

     ~Foo() //Get bad access error if destructor included in code. 
     {
          delete[] bar;
     }     

     std::vector< std::vector < int > > *bar;
 };

int main()
{
    Foo X;

    return 0;
}
4

3 に答える 3

8

そうであってはならdelete bar;ないdelete [] bar;

ルールのリストに別のルールを追加します。

削除行には、新しい行に [数字] がある場合にのみ [] を含める必要があります。

あなたの場合、new行には[some number]

 bar = new std::vector< std::vector < int > >(A, std::vector<int>(B,2);

したがって、削除行にも削除行を含める必要はありません。

于 2012-12-03T05:11:10.273 に答える
6

上記のクラスは、次のように記述したほうがよい場合があります。

struct Foo   
 {
     Foo(int A, int B)
       :  bar(A, std::vector<int>(B,2)) //creates a vector of A vectors where each nested vector contains the number 2 B times. 
     {}
     // Default copy
     // Default destructor.

     std::vector< std::vector < int > > bar;
 };

newこれにより、明示的なand delete;が回避されます。rule of thumb多くの場合、それらを正しく使用するのに最適です!

于 2012-12-03T05:20:57.287 に答える
0

C++ のようなアンマネージ コードの場合、経験則は設計で必要とされるものです。

一般に、メモリ リークを避けるためにオブジェクトをクリーンアップすることをお勧めしますが、メモリに何かを保持したい場合もあります。

于 2012-12-03T05:14:09.470 に答える