【问题标题】:C++ array 'matrix' swap (memory leak)C++ 数组“矩阵”交换(内存泄漏)
【发布时间】:2014-11-19 15:25:45
【问题描述】:

我正在创建一个基于块的引擎,并且正在研究无限加载。我正在测试一些代码,但很快我就发现了一些问题。起初我使用std::unordered_map,将 xz 存储为键,将 ChunkContainer* 存储为值。我将它存储为指针(带有新的),因为它是一个如此大的对象,它不能全部存储在堆栈中。它的大小是: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 是一个全局变量,因为我不能在本地存储它,因为它会溢出堆栈。我也不能使用交换,因为它也会溢出堆栈。

我什至应该使用此代码吗?它有效,但首先它是一种相当缓慢的方式。是否有另一种方法可以实现最快的读取访问,同时仍然能够交换值(没有内存泄漏)?

【问题讨论】:

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


    【解决方案1】:

    std::unordered_map 永远不会将其元素存储在“堆栈上”,因此这不是存储指针的好理由。在这里,您基本上可以忘记所有与堆栈相关的担忧。这样就消除了您所有的指针问题。只需直接存储元素并完成它!

    如果您测量了代码的std::unordered_map 版本并发现(非常快的)哈希查找在您的应用程序中非常慢,请务必坚持使用您的稀疏数组,但将其设为std::vector 以便元素是[为您]动态分配的。那么我在第一段中所说的一切仍然适用。 :)

    【讨论】:

    • 是的,但是我仍然有读取访问速度的问题。由于哈希图比数组慢
    • @Duckdoom5:听起来像FUD。您是否对其进行了测量并发现(非常快速的)哈希查找在您的项目中令人望而却步?即使您坚持使用稀疏数组,也将其设为 std::vector,然后我会坚持我的回答中的建议。
    • 嗯,实际上,现在我想起来了。之所以慢,是因为我使用字符串作为键。 (我使用地图已经有一段时间了,所以我不记得究竟是什么让我切换了。)我可能会再试一次std::unordered_map。您可以更改值的键而不替换它吗? cus 可以立即解决所有问题
    • @Duckdoom5: Heh, no. :) 虽然 Boost.MultiIndex 可以做到...
    • 嗯,好的。只是删除和重新添加元素,这会花费很多还是 Boost.MultiIndex 会更快?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多