0

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

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

5 回答 5

2

删除取决于您分配的方式,请参阅C++ 中 delete 和 delete [] 的区别

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

于 2012-04-22T16:01:47.087 回答
1

假设 is 的类型vertex并且std::vector<Vertex*>您按如下方式创建向量:

vertex.push_back( new Vertex );

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

但是,我劝你不要这样做。声明vertexstd::vector<std::unique_ptr<Vertex>>,您不再需要担心delete单个向量成员。

如果您使用的是 Boost,您还可以制作vertex一个boost::ptr_vector.

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

于 2012-04-22T16:04:40.310 回答
0

我假设vertexedge使用new? 那么你写的很好,但是如果你声明你的vertexedge作为一个数组并new使用new []操作符编辑那么你需要使用delete []调用而不是delete,如果计数器没有被声明为指针和new编辑那么就不需要删除计数器.

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

如果你有 c++11,那么你可以使用这些std版本而不需要boostlikestd::shared_ptrstd::unique_ptr.

于 2012-04-22T15:59:51.687 回答
0

您可以使用以下方法删除指针数组:

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

然而,如果counter来自堆栈,程序会处理它,作为程序员的你不需要担心释放内存。

于 2012-04-22T16:01:00.877 回答
0

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

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

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

于 2012-04-22T16:02:48.690 回答