C++;-如果在循环中声明对象,是否在循环结束时调用其析构函数? C++中,对象的析构函数在关闭的“}”中被调用,用于创建块,对吗?这意味着如果我有: while(some_condition) { SomeClass some_object; some_object.someFunction(); some_variable = some_object.some_member; }
然后,在循环的一次迭代中创建的对象的析构函数将在循环结束时调用,然后再创建另一个对象,对吗 谢谢。是的 但是你可以自己测试一下。这是编译器不太可能出错的语言特性C++;-如果在循环中声明对象,是否在循环结束时调用其析构函数? C++中,对象的析构函数在关闭的“}”中被调用,用于创建块,对吗?这意味着如果我有: while(some_condition) { SomeClass some_object; some_object.someFunction(); some_variable = some_object.some_member; },c++,class,object,loops,C++,Class,Object,Loops,然后,在循环的一次迭代中创建的对象的析构函数将在循环结束时调用,然后再创建另一个对象,对吗 谢谢。是的 但是你可以自己测试一下。这是编译器不太可能出错的语言特性 #include <iostream> struct S { S() { std::cout << "S::S()\n"; } ~S() { std::cout << "S::~S()\n"; } }; int main () { int i = 10; while(i--) {
#include <iostream>
struct S {
S() { std::cout << "S::S()\n"; }
~S() { std::cout << "S::~S()\n"; }
};
int main () {
int i = 10;
while(i--) {
S s;
}
}
#包括
结构{
S(){std::cout可以观察到的行为是每次迭代都调用它
不过,有关优化的常规规则仍然适用。如果编译器是智能的,并且对象简单,那么编译器可以做任何它喜欢的事情,仍然产生正确的行为,例如:
#include <iostream>
struct foo {
int i;
foo() : i (-1) {}
~foo() { i = 1; }
};
int main() {
int i = 10;
while (--i) {
foo f;
std::cout << f.i;
}
}
也就是说,展开后没有发现析构函数(尽管观察到的行为仍然相同).一旦接受的时间限制允许,我会马上接受你的答案。我不知道,编译器真的很擅长出错…:)+1测试自己是个坏主意,因为你无法判断行为是否标准、实现定义、未定义等。观察得很好,@justin。我应该添加参考资料根据适当的标准。如果成员比int更复杂,并且根据循环计数器的不同而变化,则在我的系统上生成的代码非常有趣-基本上,您最终会得到foo
的每个单独实例化的内存,这些内存位于二进制文件中,预先计算。可能的
.Ltmp5:
.cfi_def_cfa_register %rbp
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
movl $_ZSt4cout, %edi
movl $-1, %esi
callq _ZNSolsEi
xorl %eax, %eax
popq %rbp
ret