除了很多成员函数之外,我的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?
}
答案 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
分配edge
和new
?那么你所写的内容很好,但是如果你使用vertex
运算符宣布你的edge
和new
为数组而new []
为delete []
,那么你需要使用{{1} }调用而不是delete
,如果计数器未被声明为指针并且new
,那么就不需要删除计数器。
作为设计决策,您应该考虑将vertex
和edge
个对象声明为boost::shared_ptr
或unique_ptr
,以便对其进行引用计数以及Graph
对象超出范围,它们会自动清理,因此您甚至不需要充实析构函数。
如果你有c ++ 11,那么你可以使用std
版本而不需要像boost
和std::shared_ptr
这样的std::unique_ptr
。
答案 3 :(得分:0)
您可以删除指针数组:
del[] arr; // arr is array of pointers.
然而,如果counter
来自堆栈,程序将负责处理,而作为程序员,您不必担心释放该内存。
答案 4 :(得分:0)
是counter
普通的 int 变量吗?如果是这样,你就没有掌权。
删除关键字仅在您使用新关键字创建对象时使用。 (即便如此,只有当您的程序中没有其他内容时,例如shared_ptr正在为您执行删除操作)
使用new / delete时,您将从语言中接管并自行管理对象的生命周期/存在。普通变量是自动创建和销毁的,这意味着您无需担心它们。