0

我生成了 100*100*500 向量(或者说是数组)。我随机填写元素。一些元素保持为空。我可以为未使用的元素释放内存吗?或者,向量数据结构已经做到了?

谢谢

4

3 回答 3

1

您不能释放数组中单个元素占用的内存。数组作为连续的内存块分配和释放。您可能会考虑将数据存储在链接列表中,以完成该功能。如果您的问题是关于节省内存,我会想到稀疏向量。

编辑:现在我们已经澄清(在评论部分)您的目标是存储并以图形方式表示一组给定的 3d 数据,我可以提出更详细的答案:

稀疏存储 3d 数据的常用方法是octree。为了与某种体素引擎一起使用,八叉树可以很容易地实现如下:

enum AtomType
{
    NoType,
    SolidType,
    StrangeType
};

class OctreeNode
{
    public:
        virtual OctreeNode* getSubNode(unsigned index) = 0;
        virtual AtomType getContent(void) = 0;
};

class OctreeBranchNode : public OctreeNode
{
    public:
        OctreeNode* getSubNode(unsigned index)
        {
            if (subNodes) return subNodes[index]; else return nullptr;
        }

        AtomType getContent(void) { return NoType; }

    private:
        OctreeNode** subNodes;
};

class OctreeAtomNode : public OctreeNode
{
    public:
        OctreeNode* getSubNode(unsigned index) { return nullptr; }

        AtomType getContent(void) { return content; }

    private:
        AtomType content;
};

关键是,您不需要以这种方式存储坐标,因为每个节点的 3d 位置从其在树层次结构中的位置是清晰的。

如果您想实际渲染您的数据集,您可能想尝试移动立方体,甚至将每个原子渲染为一个立方体(数据集是否足够大,因此原子非常小并不重要)。还有一个关于如何编写基于 OpenGL 的体素引擎的很好的教程。

于 2013-08-26T11:52:07.523 回答
0

取决于您保存在数组中的元素的大小...您可以使用指针数组并将所有元素设置为 nullptr/NULL。因此,您可以使用 new 运算符在堆上创建新元素。但是如果元素和指针本身一样小,这种解决方案就毫无意义。

于 2013-08-26T12:12:09.557 回答
0

如果您使用std::vector,并且“100*100*500”表示“容量为 5000000 的向量”,请注意std::vector容器提供快速索引和直接数据访问,因为所有数据都存储在单个内存块中。在 c++ 中,您可以编写如下内容:

int* arr = new int[5]; 
arr[0] = 1; 
arr[4] = 5;

在这个例子中,我们有一个容量为 5 的数组,但第一个、第二个和第三个元素仍未使用,但无法释放已分配但仍未使用的内存。您还可以创建一个容量为 2 的新数组,然后将所有元素复制到新数组中,然后删除您的初始数组。这是std::vector工作原理。在 c++11 中,您也可以使用std::vector::shrink_to_fit(),但这并不能解决您的问题,因为std::vector::shrink_to_fit()不会压缩数组,而只是从向量后面删除未使用的内存分配。

于 2013-08-26T12:15:21.660 回答