delete(Object) 等价于调用 Object.~Object() 吗?
Is delete(Object) equivalent to calling Object.~Object()
我有几个类连接到AngelScript引擎。这个引擎使用有趣的方法来分配对象:它分配所需的内存量(可能带有malloc()
),当作者建议使用这样的构造来在这个内存中创建对象时:
static void Constructor(ObjectType *thisPointer)
{
new(thisPointer) ObjectType();
}
并像这样编写代码来销毁对象:
static void Destructor(ObjectType *thisPointer)
{
thisPointer->~ObjectType();
}
我有几个问题:
- 以这种方式使用析构函数是正确的方法吗?(Eclipse认为这是一个bug)据我所知,这段代码应该在不释放内存的情况下调用析构函数(调用
free()
) - 是否可以使用
delete(thisPointer)
(或类似的东西)代替这种结构,它是等效的吗? (至少这段代码在编译和运行时没有给出错误) - 有没有其他方法可以在不释放内存的情况下调用析构函数?
提前谢谢你。
C++在这里有点误导:
构造和内存管理实际上是完全不相关的过程,为了方便起见,它们C++new
和delete
但是,C++实际上没有专用语法来调用现有内存上的构造函数 - 为此,您需要使用"放置new
"语法,这实际上根本不是传统的new
- 即,它不分配内存。
另一方面,有一种语法可以调用对象的析构函数。并且您的代码正确使用它。不,使用 delete
不会等效,除了调用析构函数之外,它还会释放内存。
将其与具有方法(及其相应语义)的 std::allocator
类进行比较
-
allocate
(==::operator new(sizeof T)
) -
deallocate
(==::operator delete(&x)
) -
construct
(==new (&x) T()
) -
destroy
(==x.~T()
)
这些与对象生命周期的不同方面精确对应。
以这种方式使用析构函数是正确的方法吗?
是的。您使用 placement-new 就地构造了对象,因此必须使用显式析构函数调用将其销毁(假设它具有非平凡析构函数)。
是否可以使用
delete(thisPointer)
(或类似的东西)代替这种结构,它是等效的吗?
不。 delete
将尝试使用operator delete()
将内存释放到免费存储区;这仅在使用正常的new
表达式分配(或者可能显式使用 operator new()
)时才有效。
有没有其他方法可以在不释放内存的情况下调用析构函数?
没有。调用析构函数无疑是调用析构函数的最清晰、最简单的方法。
相关文章:
- c++ AVX512 本质上等价于 _mm256_broadcast_ss()?
- 等价于将c++上的char赋值给c#
- 什么是提升等价于标准::可选空选项
- 什么是 gtkmm 等价于 g_signal_handlers_block_by_func()
- 等价于元组的std::转换
- 等价于C++中的Java静态方法
- Averageif函数等价于C++
- C++等价于Java导入等问题
- C++等价于从C#中选择XML节点
- C等价于新对象(构造函数)
- C++等价于在python中传递lambda函数作为参数
- Microtime()等价于C和C++
- go等价于c类型
- 等价于使用Lua_newsthread在C++中创建Lua协程
- 迭代等价于递归算法
- delete(Object) 等价于调用 Object.~Object() 吗?
- 什么是LIBCURL等价于--N/--无缓冲区
- C++等价于简单的Java多态性
- 有没有一个类似/等价于Functional Java的C++库
- 多重if不带else不等价于if else?c++