首页 > 解决方案 > 确定如何破坏给定类型的对象

问题描述

所以我目前正在制作我自己的 std::vector 版本以在内核模式下使用。但是我遇到了一个问题:我不确定如何确定如何正确破坏给定元素。例如,你可以用整数填充一个数组,而你不需要做任何事情来破坏它。但是对于一个类,您需要在特定位置初始化它,new(address) Class();并像这样手动调用它的析构函数Class->~Class()

显然,您可以通过使用 type_traits 中的函数来检查给定类型是否具有析构函数,但这对我来说根本不可用,因为它没有随 WDK 一起提供。

所以我的问题是,如何确定如何破坏给定类型的对象?

标签: c++constructorkerneldestructor

解决方案


你不必。您可以调用您希望销毁的任何类型obj.~T()的对象。如果它有一个微不足道的析构函数,则此调用可能会导致编译器不发出任何操作。oT

此外,您还应该放置新的普通类型,即使它们没有显式实现的构造函数。

MWE:

#include <type_traits>
#include <new>

using T = int;

int main() {
  std::aligned_storage_t<sizeof(int), alignof(int)> storage;
  T* p = new(&storage) T;
  p->~T();  // results in zero instructions emitted
}

现场演示


推荐阅读