我有一个c ++代码:
// includes, variables etc...
GraphStructure graphStructure;
void getInput() {
graphStructure = GraphStructure(nodesCount, edgesCount);
// HERE, the destructor is called!
graphStructure.init(nodesCount, edgesCount);
// Same code as constructor, but now its okay.
}
int main(int argc, char* argv[]) {
getInput();
}
我想知道,为什么在构造之后直接调用对象的析构函数。在变量范围结束后调用析构函数,该变量应该在主函数结束之后。
答案 0 :(得分:3)
GraphStructure(nodesCount, edgesCount)
是GraphStructure
的临时实例。因此,当评估包含它的完整表达式时,它的析构函数被调用(结尾是分号;
)。
如果它是本地实例,它将受 getInput()
范围的约束,而不是main()
。当编译器到达getInput()
的末尾时(在结束大括号}
之前),它的析构函数将被调用。并且当main完成执行时,将调用main中任何局部变量的析构函数。