我有几个连接到AngelScript引擎的类.这个引擎使用有趣的方式来分配对象:它分配所需的内存量(可能有malloc()),当作者建议使用这样的结构在这个内存中创建对象时:
static void Constructor(ObjectType *thisPointer)
{
new(thisPointer) ObjectType();
}
Run Code Online (Sandbox Code Playgroud)
和这样的代码来销毁对象:
static void Destructor(ObjectType *thisPointer)
{
thisPointer->~ObjectType();
}
Run Code Online (Sandbox Code Playgroud)
我有几个问题:
free())delete(thisPointer)(或类似的东西)而不是这种结构,它是否相同?(至少这段代码在编译和运行时没有错误)先感谢您.
Kon*_*lph 12
C++在这里有点误导:
建筑和内存管理实际上是完全不相关的进程,其C++ munges在一起new和delete为了方便起见.
但是,C++实际上并没有专门的语法来调用现有内存上的构造函数 - 要做到这一点,你需要使用new实际上根本不是传统的"placement "语法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())时才有效.
是否还有其他方法可以在不释放内存的情况下调用析构函数?
并不是的.调用析构函数当然是调用析构函数的最清晰,最简单的方法.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |