0

質問がありますが、どこにも答えがありません。ただし、表示する必要があるコードがいくつかあります。

  #include "Vector2D"

    class something
    {
        Vector2D * p_Position;
      public:
        something(){p_Position = new Vector2D;}
        ~something(){delete p_Position;}
    };

    int main()
{
    std::list<something> Somethinglist;

    Somethinglist.push_back(something());

    Somethinglist.clear();
    return 0;
}

したがって、これは.clear()関数に関してはアサーションの失敗につながります。ということで、いろいろ試してみました。まず、デコンストラクタに を入れないだけで、このコードは完全に機能しますdelete p_Position。何故ですか?STLリスト.clear()関数は動的ポインタを自動的に破棄しますか? またはかなり直接的な質問: このコードを修正するにはどうすればよいですか?

4

2 に答える 2

5

std::list::push_back()引数を値で受け取ります (つまり、コピーが作成されます)。これは、Rule of Three に従っていないため、実際の問題です。

于 2013-07-06T05:01:48.130 に答える
1

まず、deconstructor に delete p_Position を入れなければ、このコードは完全に機能します。

p_Positionデストラクタに入れていない場合、割り当てが解除されないためです。メモリリークを引き起こします。

何故ですか。STL list .clear() 関数は動的ポインタを自動的に破棄しますか?

STL コンテナーは、元のオブジェクトのコピーを保持します。の場合.clear()、これらのオブジェクトは解放され、デストラクタが呼び出されます。

またはかなり直接的な質問: このコードを修正するにはどうすればよいですか?

3 つのルールに従います。

またはスマートポインターを使用する

#include <memory>
class something
{
    std::unique_ptr<Vector2D> p_Position;
  public:
    something(){}
    ~something(){}
};

またはポインターなしで使用する

class something
{
   Vector2D p_Position;
  public:
    something(){}
};
于 2013-07-06T05:12:19.590 に答える