分配大于32位的堆内存允许

Aco*_*orn 2 c++ memory memory-management openscenegraph

我正在开发一个32位的OSGEarth项目,我必须将选择的图像拼接成一个大图像.切换到64位不是一种选择.

图像作为256x256图块的集合存储在存储器中.当用户尝试从许多磁贴创建单个映像时,问题就出现了,OSGEarth内部尝试分配的内存比32位系统允许的内存多.

我试图通过分配几个数据块来解决这个限制,每个数据块大小为1025字节.然后,第1025个字节将"指向"下一个块的开头,最后一个字节为nullptr.

这就是我目前正在做的事情(我计划将来分配更多):

unsigned char* start = new unsigned char[1025];
unsigned char** head = &start;
unsigned char** tail = head + 1025;

for (unsigned int i = 0; i < 3; ++i)
{
    auto c = new unsigned char[1025];
    *tail = &c[0];
    tail = &c + 1025;
}

memset(head, 'C', 1025 * 4);
Run Code Online (Sandbox Code Playgroud)

但是,如果我期待发生的事实上正在发生,我有一些保留意见.内存是否真正分配在一个连续的块中?如果没有,那么我的memset正在写未分配的数据,这可能是坏的.

有没有解决32位限制的方法?

Nat*_*ica 5

内存是否真正分配在一个连续的块中?

没有保证.每次调用new时,都可以获得内存中任何位置的内存块.你实际做的是创建一个链表,链表不是连续的.

如果你需要连续的内存并且限制在32位,那么你真的没有什么可以做的.您可能能够捕获异常(如果有异常)并向用户报告要创建的图像很大.