c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast

标签 c++ pointers memory casting new-operator

我根据 this gamedev.net post 中的代码创建了一些自定义内存分配器.

文章中描述的实用程序模板之一是这样声明的:

template <class T> T* allocateNew(Allocator& allocator, T& t) {
    return new (allocator.allocate(sizeof(T), alignof(T))) T(t);
}

* 我将 __alignof() 转换为对 alignof() 的调用,因为我使用的是 C++11

我认为这段代码为新的 T 对象分配内存,从引用复制 t 堆栈对象到新分配的堆内存并返回 T* 指向新对象的指针。

根据这个假设,我将上面的代码转换为:

template <class T> T* allocateNew(Allocator& allocator, T& t) {
    void *ptr = allocator.allocate (sizeof (T), alignof (T));
    assert(ptr && "So that I don't dereference a null pointer");
    * (T *) (ptr) = instance; // Casting void* to T* and then dereferencing
    return (T *) ptr;
}

它似乎工作得很好。我的问题是:

  • new 与 void 指针转换有什么不同吗?
  • 两者在性能上有什么区别吗?在 G++ 中,我找不到任何显着的速度差异
  • 第二个代码示例是否存在任何漏洞(除了我通过断言检查的潜在空指针取消引用之外)?

问候,TM3P

最佳答案

Does new do anything different than the void pointer casting does?

是的;它构造一个新对象,而不是尝试分配给一个实际不存在的对象。

Is there any performance difference between the two?

对于普通类型,初始化和赋值实际上是同一件事,因此可能差别很小或没有差别。对于非平凡类型,它们调用不同的用户定义函数(构造函数与赋值运算符),这可能会做非常不同的事情。

Does the second code sample have any vulnerabilities?

对于非平凡的类型,赋值运算符可能会在赋值之前对对象的状态做出假设,并且如果没有有效的对象,则可能会出现可怕的错误,使程序陷入未定义的行为。

tl;dr 放置新作品,狡猾的类型转换是不好的。

关于c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23171191/

相关文章:

c - 如何将数组传递给 C 中的方法并编辑内容?

C、用指针将字符串按空格分割成字符串

c# - "Private Data"在 VMMAP 中定义了什么?

list - 列表和 Python 中设置的内存消耗

c++ - c++ 概念如何结合概念?

c++ - 异常规范是 SFINAE 中直接上下文的一部分吗?

java - JNA、映射和指针引用

linux - 如何查看进程的堆内存使用情况?

c++ - HD Photo 源代码在 ARM 上编译?

c++ - 指针数组/vector 是否可以自动删除指针?