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