显式析构函数调用不起作用

Explicit destructor call is not working

我的c++简化版Class:

class Class
{
public:
    Class(uint32_t size_, uint8_t val_) buf(NULL), size(size_)
    {
         buf = new uint8_t[size];
         memset(buf, val_, size);
    }
    ~Class()
    {
        if(buf != NULL)
        {
            delete[] buf;
            buf = NULL;
            size = 0;
        }
    }
    void FakeDtor()
    {
        if(buf != NULL)
        {
            delete[] buf;
            buf = NULL;
            size = 0;
        }
    }

    protected:
        uint8_t* buf;
        uint32_t size;
}

我的单元测试代码:

TEST_F(Classtest, testDestructor) 
{
    Class *buff = new Class(10,10);
    ASSERT_NE(buff->getData(), (uint8_t*)NULL);

    buff->~Class(); // buff->FakeDtor();

    ASSERT_EQ(buff->getData(), (uint8_t*)NULL);
}

当我使用 msbuild 和 运行 UT 编译代码时 - 对 dtor 的显式调用有效并且 UT 通过。当我使用 g++ 编译并使用 gtest 运行 UT 时 - 对 dtor 的显式调用似乎失败,因为以下断言失败。当我使用 FakeDtor() 而不是 ~Class() 时,UT 在 Windows 和 Linux 上都通过了。在 Linux 下显式调用 dtor 时,什么会导致它不执行?

在其非平凡析构函数 运行 调用未定义行为后读取 class 的内容。对象所在的内存还在不重要,因为你没有delete它,对象本身已经死了,不能再使用了。

从字面上看,只要您愿意,任何事情都可以发生。手头的概念类似于悬空 pointer/reference,例如参见 [​​=11=].

正如 @hvd in a .

所指出的,这是 UB 包括 "that if a destructor sets data member values, since no valid program will ever be able to read those values, a compiler can optimise away the setting of those members."