确定如何销毁给定类型的对象
Determine how to destruct an object of a given type
所以我目前正在制作我自己的 std::vector 版本以在内核模式下使用。但是我遇到了 运行 问题:我不确定如何确定如何正确销毁给定元素。例如,您可以用整数填充一个数组,而无需执行任何操作来销毁它。但是对于 class 你需要在特定位置使用 new(address) Class();
初始化它并像这样手动调用它的析构函数 Class->~Class()
.
显然,您可以使用 type_traits 中的函数检查给定类型是否具有析构函数,但这对我来说根本不可用,因为它没有随 WDK 一起提供。
所以我的问题是,如何确定如何销毁给定类型的对象?
你不必。您可以为要销毁的 T
类型的任何对象 o
调用 obj.~T()
。如果它有一个普通的析构函数,则此调用可能不会导致编译器发出任何操作。
此外,您还应该放置新的普通类型,即使它们没有显式实现的构造函数。
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
}
参见live demo。
所以我目前正在制作我自己的 std::vector 版本以在内核模式下使用。但是我遇到了 运行 问题:我不确定如何确定如何正确销毁给定元素。例如,您可以用整数填充一个数组,而无需执行任何操作来销毁它。但是对于 class 你需要在特定位置使用 new(address) Class();
初始化它并像这样手动调用它的析构函数 Class->~Class()
.
显然,您可以使用 type_traits 中的函数检查给定类型是否具有析构函数,但这对我来说根本不可用,因为它没有随 WDK 一起提供。
所以我的问题是,如何确定如何销毁给定类型的对象?
你不必。您可以为要销毁的 T
类型的任何对象 o
调用 obj.~T()
。如果它有一个普通的析构函数,则此调用可能不会导致编译器发出任何操作。
此外,您还应该放置新的普通类型,即使它们没有显式实现的构造函数。
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
}
参见live demo。