显式析构函数调用不起作用
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."
我的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