【问题标题】:Memory allocate in c++c++中的内存分配
【发布时间】:2022-01-21 10:25:53
【问题描述】:

我有一个项目,我必须在程序启动时分配 1024 个字节。在 C++ 程序中。

void* available = new char*[1024];

我写了这个,我觉得还可以。 现在我的问题开始了,我应该创建一个函数来接收我应该分配的 size_t 大小(字节数)。我的分配应该返回一个指向这个可用内存的第一个字节的 void* 指针。所以我的问题是如何分配具有大小的 void* 指针并从我的可用内存中获取内存。

我是一名学生,我不是 C++ 专业人士。 也很抱歉我的错误解释。

【问题讨论】:

  • 好的,谢谢,这很有帮助。但是我的函数应该完全这样做:void * allocate (size_t size),它以字节为单位获取大小并返回一个指向专用内存块的指针
  • @CherryDT 这个我明白,但是如何从我之前分配的内存中分配这个指针。
  • 这个函数应该这样做:当我给出一个字节大小时,我应该创建一个指针,该指针应该指向内存中的第一个字节,在那里我可以有足够的空间来存储这个新内存。跨度>
  • 对不起,我完全误解了你的问题。你一直在谈论分配一个指针(这实际上并不是你做的事情),我以为你没有意识到 new 已经返回了一个指向它刚刚分配的内存的指针,并且操作系统已经处理好了确保您有足够的空间。对我来说缺少的部分是你正在构建一个自定义堆/内存管理器。
  • @CherryDT 问题出在我的身上,对不起兄弟。但是,是的,我的任务是使用以下功能来做我的堆和内存管理器:new、free、delete。

标签: c++ memory


【解决方案1】:

您似乎正在尝试创建memory pool。尽管这是一个很大的话题,但让我们检查一下您可以投入多少精力来创建这样的东西。

游泳池有一些基本元素需要掌握。首先是内存本身,即你从哪里提取内存。在您的情况下,您已经决定要动态分配固定数量的内存。要正确执行此操作,代码应为:

char *poolMemory = new char[1024];

我没有在这里选择void* pool,因为delete[] poolundefined when pool is a void pointer。你可以选择malloc/free,但我会保留它 C++。其次,我没有像您的代码所示那样分配指针数组,因为它分配了1024 * sizeof(char*) 字节的内存。

第二个考虑因素是如何归还您为池获得的内存。在您的情况下,您要记住将其删除,以便最好将其放在一个类中为您执行 RAII:

class Pool
{
  char *_memory;
  void *_pool;
  size_t _size;

public:
  Pool(size_t poolSize = 1024)
    : _memory(new char[poolSize])
    , _pool(_memory)
    , _size(poolSize)
  {
  }

  ~Pool() { delete[] _memory; } // Forgetting this will leak memory. 
};

现在我们来到您要询问的部分。您想使用该池内的内存。在Pool 类中创建一个名为allocate 的方法,该方法将返回n 个字节。这个方法应该知道池中还剩下多少字节(成员_size),并且本质上执行指针运算以让您知道哪个位置是空闲的。不幸的是有捕获。您必须提供生成的内存应具有的所需对齐方式。这是另一个大话题,从我认为你不打算处理的问题来看(所以我默认对齐为 2^0=1 字节)。

#include <memory>

void* Pool::allocate(size_t nBytes, size_t alignment = 1)
{
    if (std::align(alignment, nBytes, _pool, _size))
    {
        void *result = _pool;
        // Bookkeeping
        _pool = (char*)_pool + nBytes; // Advance the pointer to available memory. 
        _size -= nBytes;               // Update the available space. 
        
        return result;
    }
    return nullptr;
}

我使用std::align 完成了这个指针运算,但我想你可以手动完成。在现实世界的场景中,您还需要一个deallocate 函数,该函数在使用后“打开”池内的点。当池内存不足时,您还需要一些策略,即回退分配。此外,最初的内存获取可能更有效,例如在适当的地方使用静态内存。这有很多方面和方面,我希望我包含的初始链接能给你一些动力来研究这个主题。

【讨论】:

  • 这对 tnx 真的很有帮助,兄弟。
猜你喜欢
  • 2014-10-25
  • 2010-12-11
  • 2010-11-07
  • 2010-10-16
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
相关资源
最近更新 更多