gpt4 book ai didi

c++ - 显式析构函数调用不起作用

转载 作者:行者123 更新时间:2023-11-30 03:39:21 25 4
gpt4 key购买 nike

我的 C++ 类的简化版本:

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不执行的原因是什么?

最佳答案

在非平凡的析构函数运行后读取类的内容会调用未定义的行为。对象所在的内存仍然存在并不重要,因为您没有删除它,对象本身已经死了,无法再使用。

从字面上看,如果您无论如何都这样做,那么一切都可以发生。手头的概念类似于悬挂指针/引用,例如参见 this .

这是 UB 包括 “如果析构函数设置数据成员值,因为没有有效的程序将永远能够读取这些值,编译器可以优化掉这些成员的设置。” as @hvd指出在comment .

关于c++ - 显式析构函数调用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38914383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com