1

オブジェクトポインタを要素として受け取るSTLコンテナがある場合、そのようなコンテナを持つクラスのデストラクタのポインタを削除する必要があります。ポインタを削除する操作から

delete ptr_; 
ptr_ = 0;

よく使われるかもしれませんが、これを行う関数(または関数オブジェクト)テンプレートがあり、boost、STL、または次の例で定義されている関数オブジェクトDeletePointerとして標準によって定義されているのではないでしょうか。

#include <list>
#include <algorithm>

template<class Pointer>
class DeletePointer
{
    public: 
        void operator()(Pointer t)
        {
            delete t; 
            t = 0;
        }
};

using namespace std;

int main()
{
    list<double*> doublePtrList;

    doublePtrList.push_back(new double (0));
    doublePtrList.push_back(new double (1));
    doublePtrList.push_back(new double (2));
    doublePtrList.push_back(new double (3));

    for_each(doublePtrList.begin(), doublePtrList.end(), DeletePointer<double*>());
};
4

3 に答える 3

3

(何らかの理由で) コレクションに未加工のポインターの代わりにスマート ポインターを格納できない場合は、代わりに Boostポインター コンテナーを使用することを検討してください。

于 2013-01-14T09:19:49.620 に答える
1

std の共有ポインタを使用するだけです。

include <memory>

using namespace std;

int main()
{
    list<shared_ptr<double>> doublePtrList;

    doublePtrList.push_back(make_shared<double>(0.0));
    doublePtrList.push_back(make_shared<double>(1.0));
    doublePtrList.push_back(make_shared<double>(2.0));
    doublePtrList.push_back(make_shared<double>(3.0));

    //for_each(doublePtrList.begin(), doublePtrList.end(), DeletePointer<double*>());

    //For clearing just clear the list
    doublePtrList.clear();
};

共有ポインタは、誰も参照していないときにメモリを自動的に解放します(または、最後の参照が参照を停止すると、より正確になります)

于 2013-01-14T09:19:52.897 に答える
1

他の人が示唆しているように、可能な限り生のポインターの代わりにスマートポインターを使用することをお勧めします。

ただし、質問に直接答えるには、 (C ++ 11で)にstd::default_delete定義されています。<memory>

于 2013-01-14T09:19:04.287 に答える