有没有办法从特定的内存位置分配内存?

时间:2014-10-27 05:33:20

标签: c++ memory

让我用一个例子解释一下: 想象一下,我们想要调整动态分配的对象数组... 所以我们有这样的解决方案:
使用新大小创建一个新数组并尝试将旧数组复制到此数组并尝试释放旧数组...

但我想要的是检查数组后面的内存是否有空闲空间,如果它存在为我的数组分配内存而不是防止内存开销!另一方面,如果我们的新数组没有足够的内存和旧数组同时,我们无法调整它!
有没有办法从特定的内存位置分配内存?

4 个答案:

答案 0 :(得分:2)

您可能需要placement new,它实际上将您的对象“放置/构造”在特定的内存地址中。新位置分配内存,您应该手动为对象调用析构函数。具有以下语法

char memory[sizeof(Fred)];   // allocate a block of memory with sizeof(Fred)  
void* place = memory;          
Fred* f = new(place) Fred();
// The pointers f and place will be equal 

f->~Fred(); // explicitly delete the object *not* the memory block.

除非您知道自己在做什么,否则指南行不会使用Placement new。例如,您确定可以提高性能的专用内存分配器。例如,在游戏中,通常会创建一个内存池,其中连续创建和删除许多对象,您可以分配特定大小的内存块,然后构造和删除对象(重用内存块)。

答案 1 :(得分:0)

我想你想要placement new运算符。另请阅读operator new文档C++ memory management,并考虑使用专门的Allocators

答案 2 :(得分:0)

当我问这个问题我的答案是“没办法”时,这个引发了我的采访记忆。

确实有多种用途,其中一种是将对象放置在内存中的特定位置。

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

void someCode()
{
  char memory[sizeof(Abc)];     
  void* place = memory;          

  Abc* f = new(place) Abc();   
  // The pointers f and place will be equal  <<<< CAUTION OVER HERE

  ...
}

答案 3 :(得分:0)

如果你需要避免数组移动,并且我能想到的唯一好处是数组需要对它进行无锁多线程访问,那么最好在mmap保留地址空间的情况下首先分配数组。这总是足够的。假设您使用的是64位操作系统,地址空间实际上是无限供应。 malloc可能会在linux上运行,具体取决于你的过度使用设置,因为这样可能会使用新的,因为consructors将访问数据并耗尽所有内存。