C ++数组'矩阵'交换(内存泄漏)

时间:2014-11-19 15:25:46

标签: c++ arrays memory-leaks stack-overflow

我正在创建一个基于块的引擎,我正在进行无限加载。我正在测试一些代码,但很快就注意到了一些问题。起初我使用std::unordered_map,将xz作为键存储,将ChunkContainer *存储为值。我将它存储为指针(使用new),因为它是一个很大的对象,它不能全部存储在堆栈中。它的大小是:CHUNK_SIZE(32)^3 * WORLD_HEIGHT(8 amount of chunks in height) * 4(block bytes) = 1048576 bytes。 (并且* 225构成了我的世界。)

然后我交换使用大数组而不是std::unordered_map,这样我就可以实现更快的读取速度。所以我需要交换加载代码。我想出了这段代码,

但是我在使用此代码时遇到了一些内存泄漏问题:

for(int z = 0; z < size; z++){
    temp = loadedChunkContainers[(size-1)*size + z]; //Store the last container in a temp var

    for(int x = size-1; x > 0; x--){
        loadedChunkContainers[x * size + z] = loadedChunkContainers[(x-1) * size + z]; //Move all containers 1 to the right
    }
    int cx = temp.getX() - size;
    int cz = temp.getZ();

    temp.move(cx, cz);//Move the container internally
    loadedChunkContainers[z] = temp; //put the container back into the array, but this time on the first row
    buildQueue.push_back(&loadedChunkContainers[z]);
}

temp是一个全局变量,因为我无法将其存储在本地,因为它会溢出堆栈。我也不能使用swap,因为它也会溢出堆栈。

我是否应该使用此代码?它有效,但首先它是一个相当缓慢的方式。是否还有另一种方法可以获得最快的读访问权限,同时仍然可以交换值(没有内存泄漏)?

1 个答案:

答案 0 :(得分:0)

std::unordered_map永远不会将其元素&#34;存储在堆栈&#34;上,因此这不是存储指针的好理由。你可以在这里忘记所有与堆栈相关的烦恼。随之而来的是你所有的指针麻烦。只需直接存储元素并完成它!

如果您已经测量了代码的std::unordered_map版本并且发现(非常快)哈希查找在您的应用程序中非常慢,那么一定要坚持使用稀疏数组,但要使其成为{{1这样就可以[为你]动态分配元素。然后我在第一段中说的一切仍然适用。 :)