我有一个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();
}


我想知道,为什么在构造对象之后直接调用该对象的析构函数。析构函数在变量作用域结束之后调用,该作用域应在主函数结束之后。

最佳答案

GraphStructure(nodesCount, edgesCount)GraphStructure的临时实例。这样,在评估包含其的完整表达式时(其结尾在分号;时)将调用其析构函数。

如果它是本地实例,它将受到getInput()而不是main()范围的约束。当编译器到达getInput()的结尾时(恰好在括号}之前),将调用其析构函数。当main完成执行时,将调用main中任何局部变量的析构函数。

10-04 21:50