如何为3D矢量中未使用的元素释放内存?

时间:2013-08-26 11:13:44

标签: c++ memory vector multidimensional-array

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

谢谢

3 个答案:

答案 0 :(得分:1)

您无法释放数组内单个元素占用的内存。数组被分配并释放为连续的内存块。您可以考虑将数据存储在链接列表中,以实现该功能。如果你的问题是关于保存记忆,我会想到稀疏的向量。

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

稀疏存储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位置都是从树层次结构中的位置清除的。

如果你想实际渲染你的数据集,你可能想尝试marching cubes或甚至将每个原子渲染为一个立方体框(如果数据集足够大并且因此原子很漂亮也没关系小)。关于如何编写基于OpenGL的体素引擎,还有一个很好的tutorial

答案 1 :(得分:0)

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

答案 2 :(得分: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()不压缩数组,只是从向量的后面删除未使用的内存分配。