xll Release / Debug中的c ++析构函数构建

时间:2017-03-02 13:32:21

标签: c++ destructor

以下两个函数中MyObject的销毁方式有何不同?

void myFunc1(){
    MyObject obj;
    // do something with the object
}

void myFunc2(){
    {
      MyObject obj;
      // do something with the object
    }
    // do some irrelevant random stuff that is not taken out by the compiler, for example
    std::string test = "test";
    test.append("blah");
}

MyObject的(虚拟)析构函数类似于

MyObject::~MyObject()
{
    revert();
}

其中revert是公共(非虚拟)成员函数。

我问,因为我注意到,当使用myFunc1运行Release版本时,似乎在销毁时不会调用revert方法(当它处于调试模式时)。我可以看到,因为该方法应该改变我可以从代码中的其他地方访问的指针的值。 myFunc2也不会发生同样的问题。

在这两种情况下,我都使用了xll构建并从Excel中调用了函数。

编辑: revert方法调用嵌套类中定义的成员对象的revert方法,这只是

NestedObject::revert()
{
    *myPtr = myBackup;
}

似乎没有被调用。但是,如果我添加一行像

NestedObject::revert()
{
    OutputDebugString("test");
    *myPtr = myBackup;
}

然后一切正常。所以我的印象是这与编译器的优化有关。

0 个答案:

没有答案