【问题标题】:Parameters to operator new运算符 new 的参数
【发布时间】:2016-01-14 22:23:40
【问题描述】:

我正在尝试为特定类编写自定义分配器。我对分配器的经验基本上没有,所以这可能很明显。

我希望我的分配取决于某些参数。粗略地说,我希望有多个内存管理器,每个管理几个对象。在创建对象时,我会知道该对象应该属于哪个管理器。在阅读了关于重载operator new 的大量内容后,我对如何实现我需要的东西感到迷茫。

This page 表示有一个版本的operator new 接受用户定义的参数,但似乎在使用new 分配对象时不会调用此版本。有人可以指出如何构建除全局分配器之外的任何东西吗?在相关说明中,如果我使用重载的特定于类的operator new,如何调用参数化构造函数?

【问题讨论】:

  • 您必须编写自定义operator new 重载吗? STL 使用可以作为模板参数传递的分配器类,而不是直接调用new
  • 我需要它们用于不使用 STL 类的自定义数据结构。 templatetypedef 似乎有答案。

标签: c++ c++11 memory-management


【解决方案1】:

您可以通过为operator new 定义重载来创建一个自定义分配器,该分配器接受额外的参数,如下所示:

void* operator new (size_t size, /* extra parameters here */) {
    /* Do something, then return a pointer to at least 'size' bytes. */
}

然后你可以通过写来使用你的分配器

MyObject* obj = new (/* extra params */) MyObject(/* constructor args */);

例如,这是一个愚蠢的自定义分配器,当您分配某些东西时会打印出一条消息:

void* operator new(size_t numBytes, const std::string& message) {
    std::cout << "Custom message: " << message << std::endl;

    /* Use the default allocator to get some bytes. */
    return ::operator new(numBytes);
}

你可以通过写来调用它

std::complex<double>* obj = new ("Hello, world!") std::complex<double>(0.0, 0.0);

【讨论】:

  • 我一直认为放置 new 仅适用于不需要新鲜内存的情况。我弄错了吗?
  • 上面的代码实际上并不适用于新的展示位置。 Placement new 是operator new 的特定重载,调用它的语法看起来很像调用上述分配器的语法,因为它们都使用相同的语言特性。不过你说得对,新位置适合你已经有记忆的地方。
  • 看这个,我觉得placement new只是这个的一个版本,其中“额外参数”是一个指向已经分配的内存位置的指针。对吗?
  • @user2308211 : 确实,另一个例子是 nothrow-new
  • @user2308211 "placement new" 既用于一般 new-with-argument((stuff) 是语法中的 new-placement)构造,也用于请参阅采用 void* 的特定保留放置形式 new。
猜你喜欢
  • 2013-05-14
  • 2015-07-29
  • 2011-05-24
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多