当前位置: 首页 > 知识库问答 >
问题:

为什么realloc为自定义分配器使我的数据无效?

武向文
2023-03-14

我已经使用malloc为我的堆栈分配器预分配了一大块内存,但是我希望它能够扩展它的内存。alloc函数如下所示:

void* _stack = malloc(4096);

...

template <class T>
T* allocate(const std::size_t& blockSize)
{
    std::size_t newMemoryBlock = (std::size_t)_stack + _stackHead;

    _stackHead += blockSize;

    return (T*)newMemoryBlock;
}

这种方法很好(也适用于对齐[即使它不在示例中])。但是,当堆栈尝试通过此函数重新定位其缓冲区时,会出现问题:

static void allocateMoreMemory(void*& srcPtr, std::size_t& srcBufferSize, uint sizeMultiplier = 2)
{
    //Double the size
    srcBufferSize *= sizeMultiplier;

    void* newBuffer = realloc(srcPtr, srcBufferSize);

    if (!newBuffer)
    {
        std::cout << "Reallocation failed" << std::endl;
    }
    else
        srcPtr = newBuffer;
}

在这个问题中,用法是这样的:

StackAllocator<6> allocator;

std::vector<int*> vector(2);

for (std::size_t i = 0; i < 2; i++)
{
    vector[i] = allocator.allocate<int>();
    *vector[i] = i;
}

for (std::size_t i = 0; i < 2; i++)
{
    std::cout << *vector[i] << std::endl;
}

如您所见,它为第一个整数分配了一个空间,然后当它尝试分配第二个整数时,它需要重新分配(因为我们只为6个字节初始化了分配器)。更改后,第一个整数值更改为随机值。来自std::out的控制台输出

在这种情况下,是否可以使用realloc?或者这是因为我把记忆用于不同的类型?如果可能,如何解决?谢谢

共有1个答案

潘凯
2023-03-14

问题是

vector[i] = (int*)allocator.allocate<int>();

在某些情况下,realloc可能会更改内存块,以获得适合较大内存的内存块。

所有以前出现的向量[i]都将无效,您必须更新所有以前的值(在您的上下文中不是很方便)

您的分配器必须返回不同的内存区域,并且不能使用realloc。

如果你需要所有向量的连续内存,你必须创建一个更高级别的对象来处理重新分配

如果您不需要连续内存,只需坚持向量向量(std::向量

 类似资料:
  • 我已经为我的自定义日志拦截器执行了以下操作 我正在将拦截器设置为restTemboard 记录器正在将响应正确地打印到控制台,但最后响应会以空的形式返回给调用者。我无法调试和解决它。 我已经弄明白了StreamUtils。copyToString(response.getBody(),字符集。defaultCharset())正在读取一次输入流,并且不再在其中保存响应正文(现在为空) 还有谁也面临

  • 我正在编写一个Spring Boot(批处理)应用程序,它应该用一个特定的退出代码退出。一个要求是在数据库无法连接时返回退出代码。 我的方法是通过显式创建bean、调用并捕获和抛出实现的自定义异常来尽早处理此异常。配置如下: 我希望尽可能多地重用Spring Boot自动配置,这就是为什么我使用。我不知道这是不是应该走的路。 对的调用返回配置的url(从我的属性文件中): 但为什么Spring B

  • 我有一个图像压缩应用程序,现在有两个不同版本的内存分配系统。在最初的一个例子中,malloc无处不在,在第二个例子中,我实现了一个简单的池分配器,它只分配大块内存,并将部分内存返回给myalloc()调用。 我们注意到,使用malloc时会产生巨大的内存开销:在内存使用量最大的时候,malloc()代码对于1920x1080x16bpp映像需要大约170 MB的内存,而池分配器只分配48 MB,其

  • 我正在尝试为Xamarin.Forms创建一个自定义的ButtonRenderer。下面是一个简单的测试,我一直在尝试根据一些教程组合起来,但我似乎可以使它工作。

  • @IsaAccisneros创建了新的SpinnerItem和MySpinnerAdapter类。我完全执行了他的新类。我的实现如下所示: 而他的长相是这样的: 那为什么我的行为怪异呢?我的代码的上下文是我的AddItemFragment在我的activity中的onCreateView。我说错了什么?谢谢! 编辑:已请求适配器类代码...

  • 问题内容: 我一直在跟随一个教程,教科书向我保证这可以工作,但是 错误:[ng:areq]参数’SimpleController’不是一个函数,未定义 为什么?我掉毛了,在它上面上下移动,看不到问题。为什么出现未定义状态? 问题答案: 我的猜测是您使用的angular.js版本是更新的。 有一个重大变化,即: 默认情况下 , angular将不再寻找控制器。有关更多详细信息,请参见3f2232b5