这是编写析构函数的正确方法吗?

时间:2012-04-22 15:55:29

标签: c++ destructor

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

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? 
}

5 个答案:

答案 0 :(得分:2)

删除取决于您分配的方式,请参阅The difference between delete and delete [] in C++

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

答案 1 :(得分:1)

假设vertex的类型为std::vector<Vertex*>,您可以按如下方式创建向量:

vertex.push_back( new Vertex );

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

但是,我建议您不要这样做。vertex声明为std::vector<std::unique_ptr<Vertex>>,您无需担心delete单个向量成员了。

如果你正在使用Boost,你也可以将vertex设为boost::ptr_vector

至于counter变量,除非你在课堂建设期间new某个地方,否则你不需要delete

答案 2 :(得分:0)

我假设使用vertex分配edgenew?那么你所写的内容很好,但是如果你使用vertex运算符宣布你的edgenew为数组而new []delete [],那么你需要使用{{1} }调用而不是delete,如果计数器未被声明为指针并且new,那么就不需要删除计数器。

作为设计决策,您应该考虑将vertexedge个对象声明为boost::shared_ptrunique_ptr,以便对其进行引用计数以及Graph对象超出范围,它们会自动清理,因此您甚至不需要充实析构函数。

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

答案 3 :(得分:0)

您可以删除指针数组:

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

然而,如果counter来自堆栈,程序将负责处理,而作为程序员,您不必担心释放该内存。

答案 4 :(得分:0)

counter普通的 int 变量吗?如果是这样,你就没有掌权。

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

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