【问题标题】:Is this the right way to write a destructor?这是编写析构函数的正确方法吗?
【发布时间】:2012-05-03 09:51:45
【问题描述】:

除了许多成员函数之外,我的 Graph 类还有 3 个主要成员:指向其顶点的指针向量,称为“vertex”,指向其边的指针向量,称为“edge”,以及一个整数计数器变量。我开始/尝试编写析构函数以从向量中释放内存,但我不确定我是否正确执行。我该怎么处理柜台?我试图说“删除计数器”,但它不是指针(哎呀)。

Graph<Object,Weight>::~Graph(){
        for(unsigned int i=0; i<vertex.size(); ++i){
                delete vertex[i]; }
        for(unsigned int j=0; j<edge.size(); ++j){
                delete edge[j]; }

        //counter? 
}

【问题讨论】:

  • 你能用vector&lt;Vertex&gt;代替vector&lt;Vertex*&gt;等吗?然后他们会自己清理。

标签: c++ destructor


【解决方案1】:

删除取决于你分配的方式,见The difference between delete and delete [] in C++

至于您的 int 成员,由于您没有动态分配它(您没有使用 new),因此您不必删除它。

【讨论】:

    【解决方案2】:

    假设vertex 的类型是std::vector&lt;Vertex*&gt; 并且您创建向量如下:

    vertex.push_back( new Vertex );
    

    您的清理代码看起来正确。

    但是,我劝你不要这样做。vertex 声明为std::vector&lt;std::unique_ptr&lt;Vertex&gt;&gt;,你就不必再担心delete 单个向量成员了。

    如果您使用的是 Boost,您还可以将 vertex 设为 boost::ptr_vector

    至于counter 变量,除非您在类构建期间在某处new 计数器,否则您不需要delete 它。

    【讨论】:

      【解决方案3】:

      counter 是一个普通的 int 变量吗?如果是这样,您将不负责它的生命周期。

      delete 关键字仅在您使用 new 关键字创建对象时使用。 (即便如此,只有当您的程序中没有其他内容时,例如 shared_ptr 正在为您执行删除操作)

      使用 new/delete 时,您将接管语言并自己管理对象的生命周期/存在。普通变量是自动创建和销毁的,这意味着您无需担心它们。

      【讨论】:

        【解决方案4】:

        你可以删除一个指针数组:

        del[] arr; // arr is array of pointers.
        

        然而,如果counter 来自堆栈,程序会处理它,而您作为程序员无需担心释放该内存。

        【讨论】:

        • hmm... 我认为如果调用此代码会使我的应用程序崩溃: void foo() { void* array_of_pointers[12] = {};删除[] array_of_pointers; }
        【解决方案5】:

        我假设vertexedge 是使用new 分配的?那么您所写的内容很好,但是如果您将 vertexedge 声明为数组并使用 new [] 运算符声明 newed,那么您需要使用 delete [] 调用而不是 delete,如果计数器未声明为指针和newed,则无需删除计数器。

        作为设计决策,您应该考虑将您的 vertexedge 对象声明为 boost::shared_ptrunique_ptr 以便对它们进行引用计数,并且当 Graph 对象超出范围时,它们会被自动清理所以你甚至不需要充实你的析构函数。

        如果你有 c++11,那么你可以使用 std 版本,而不需要像 std::shared_ptrstd::unique_ptr 这样的 boost

        【讨论】:

        • 你不再需要提升了,std::unique_ptr​std::shared_ptrC++11 中有:)
        • @vivek true 但不是每个人都有 c++11,我还没有,我会更新我的帖子
        猜你喜欢
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 2014-12-17
        • 1970-01-01
        • 2016-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多