【问题标题】:Passing pointers to new operator将指针传递给新运算符
【发布时间】:2014-01-02 08:47:42
【问题描述】:

这段代码是什么意思?根据这个link,没有办法将指针传递给新的运算符。 new 这里的操作符是默认的,而不是重载的。请帮忙

LPVOID m_Buffer;
MyClass* mc = new(reinterpret_cast<void*>(m_Buffer)) MyClass;

【问题讨论】:

  • 这里是龙。你不想使用它。
  • 您引用的代码非常危险,因为它试图使用未初始化的地址进行新的放置。这意味着您将把MyClass 构造成一个随机的、可能未分配的地址。

标签: c++ winapi memory-management


【解决方案1】:

这是placement new。它用于例如将对象放置在指定位置。

【讨论】:

  • 感谢您的回答。那么,reinterpret_cast 在这里做了什么?
  • reinterpret_cast 未被选中(所有 C++ 风格的强制转换也是如此)。编译器验证被转换的类型和被转换成的类型是否相互兼容。如果不是,则编译失败。
  • @RemyLebeau 但在运行时未选中。这就是我的意思,对不起。
  • 这只是将 LPVOID 转换为 void*。这两者之间是有区别的,例如比较 LPVOID 和 void* 之间的差异。运行时不检查 reinterpret_cast。
【解决方案2】:

这是placement new。此版本的 new 运算符允许您将新实例放置在预分配的内存中。当您想要分配大量实例时,它非常有用,因为您将大大减少实际内存操作的数量,这可能会提高您的应用程序的性能。

示例(取自 Parashift C++ FAQ):

#include <new>        // Must #include this to use "placement new"
#include "Fred.h"     // Declaration of class Fred

void someCode()
{
    char memory[sizeof(Fred)];     // Line #1
    void* place = memory;          // Line #2

    Fred* f = new(place) Fred();   // Line #3 (see "DANGER" below)
    // The pointers f and place will be equal

    ...
}

值得注意的是,您必须确切地知道一个类需要多少空间,并且可能会因编译器设置/平台和其他十几个原因而有所不同。因此,在你需要它并且真正知道你在做什么的时候使用它。

【讨论】:

  • 在将memory 传递给new() 之前,您无需将其分配给单独的void* 变量。您可以将memory 直接传递给new(),因为所有指针都会隐式降级为void*Fred* f = new(memory) Fred();
猜你喜欢
  • 2021-12-27
  • 2021-01-05
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 2013-08-03
  • 2021-01-03
相关资源
最近更新 更多