如果我从方法返回CString会发生什么?它会调用CString的析构函数吗?
CString f(){
CString s = g();
return s;
}
const char* g(){ return new char[5]; }
谢谢:)
答案 0 :(得分:6)
不一定。
如果您的编译器实现了返回值优化(RVO),那么它可以设置对f()
的调用,以便在调用者存储返回值的地方构造s
,因此它可以忽略调用CString
拷贝构造函数和析构函数。此优化是C ++标准允许的少数例外优化规则之一。
如果您在禁用所有优化的情况下进行编译,则在处理对CString
的调用时,您可能会看到对f()
复制构造函数和析构函数的一次或多次调用。
答案 1 :(得分:0)
编译器将在完成函数执行时调用任何不再存在的对象的析构函数。由于s
被声明为函数f()
的本地对象,因此本地对象(如s
)将不复存在,因此,编译器将调用它们的析构函数。