4

オブジェクトへのポインタを含むベクトルがあり、clear関数を使用しても、ベクトル内のオブジェクトのデストラクタは呼び出されません。これを手動で行う関数を作成しましたが、これをベクトル内にある可能性のあるあらゆる種類のオブジェクトのジェネリック関数にする方法がわかりません。

void buttonVectorCleanup(vector<Button *> dVector){
    Button* tmpClass;
    for(int i = 0; i < (int)dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }
}

これは、ベクトル内の特定のタイプのオブジェクトに対して正常に機能する関数ですが、オブジェクトポインターを使用して任意の種類のベクトルを取得できる単一の関数が必要です。

4

4 に答える 4

8

Boostのポインタコンテナを使用することをお勧めします。それらは非常に効率的で安全です。

于 2008-10-29T02:03:25.520 に答える
6

最善の方法は、 Boostなどのスマートポインターを使用することです。その後、オブジェクトは自動的に削除されます。

または、テンプレート関数を作成できます

template <class T>
void vectorCleanup(vector<T *>& dVector){
    T* tmpClass;
    for(vector<T*>::size_type i = 0; i < dVector.size(); i++){
        tmpClass = dVector[i];

        delete tmpClass;
    }

}

于 2008-10-29T01:24:38.547 に答える
2

他のいくつかのポイント - おそらくコピーではなく、ベクトルへの参照を渡したいでしょう。tmpClass は必要ありません。ポインターを直接削除できます。ベクトルのサイズを 0 に変更するか、削除後にポインターを NULL に置き換える必要があります。そうしないと、呼び出し元の関数で未割り当てのメモリにアクセスする可能性があります。

于 2008-10-29T01:35:38.040 に答える
2

特別なファンクターを使用してポインターを削除し、NULL に設定します。

struct delete_ptr
{
    template <typename T>
    void operator()(T& p)
    {
        delete p;
        p = 0;
    }
};

と一緒に使用されstd::for_eachます(忘れないでください#include <algorithm>):

int wmain(int, wchar_t*[])
{
    std::vector<int*> items;
    items.push_back(new int(1));
    items.push_back(new int(2));
    items.push_back(new int(3));
    std::for_each(items.begin(), items.end(), delete_ptr());
};
于 2008-10-29T07:24:28.727 に答える