【问题标题】:How do I create a generic std::vector destructor?如何创建通用 std::vector 析构函数?
【发布时间】:2010-09-19 17:12:10
【问题描述】:

拥有一个包含指向对象指针的向量,然后使用 clear 函数不会调用向量中对象的析构函数。我创建了一个手动执行此操作的函数,但我不知道如何将其作为向量中可能存在的任何类型对象的通用函数。

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

        delete tmpClass;
    }
}

这是我拥有的函数,它适用于向量中特定类型的对象,但我想要一个可以接受任何类型的向量和对象指针的函数。

【问题讨论】:

    标签: c++ stl vector destructor


    【解决方案1】:

    您可能想使用 boost 的 pointer containers。它们高效且安全。

    【讨论】:

      【解决方案2】:

      最好的办法是使用智能指针,例如来自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;
          }
      

      }

      【讨论】:

      • 我想要的;虽然我花了一些额外的工作才能让它全部工作;见:codeguru.com/forum/showthread.php?t=250284
      • 这是错误的做法。它不是异常安全的。您必须显式调用它以确保正确清理矢量。
      • 其他几件事。通过引用传递(您正在制作向量的副本)。该向量仍然充满指针(现在全部无效)。 size() 不返回“无符号”
      • 您是正确的,即将传递参考。 size() 返回一个无符号整数类型,它可能是无符号的,但我将其更改为正确使用 size_type。我试图摆脱原版中不必要的演员表。
      • Keith: • 为什么不传递const 参考? • 为什么使用显式索引而不是迭代器? • 为什么是(完全无用且令人困惑的)临时变量tmpClass? • 为什么容器类型不是类型参数(即为什么只支持vectors)?
      【解决方案3】:

      其他几点 - 您可能希望传递对向量的引用,而不是副本。不需要 tmpClass - 您可以直接删除指针。您应该在删除后将向量的大小调整为 0 或用 NULL 替换指针 - 否则您可以在调用函数中访问未分配的内存。

      【讨论】:

        【解决方案4】:

        我使用一个特殊的函子来删除指针并将其设置为NULL:

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

        std::for_each一起使用(也别忘了#include &lt;algorithm&gt;):

        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());
        };
        

        【讨论】:

        • 您可能想将此命名为 delete_and_zero。如果你要 clear() vector 无论如何,归零是没有用的。
        猜你喜欢
        • 1970-01-01
        • 2016-11-04
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        相关资源
        最近更新 更多