【问题标题】:bad memory alloc error - segment tree内存分配错误 - 段树
【发布时间】:2016-08-13 20:43:38
【问题描述】:

我正在尝试创建一个分段树,

这是我的树节点结构:

struct Node{
    int x1, x2; // x coordinates
    int y1, y2; // y coordinates
    Node * v1;
    Node * v2;
    Node * v3;
    Node * v4;
    bool oBo; //check if 1 by 1 
    bool O;
    bool F;
    int dimens;
    Node(int myx1, int myx2, int myy1, int myy2){
        this->x1 = myx1;
        this->x2 = myx2;
        this->y1 = myy1;
        this->y2 = myy2;
        this->dimens = abs(x2 - x1);
        if (dimens == 1)
        {
            this->oBo = true;
        }
        else
            this->oBo = false;

        this->O = false;
        this->F = false;

        this->v1 = NULL;
        this->v2 = NULL;
        this->v3 = NULL;
        this->v4 = NULL;
    }
};

这是我的地图构造函数

MapTree::MapTree(int iSize)
{
this->size = iSize;
root = new Node(0, size, 0, size);
segment(root);
}

我正在使用 this 段函数来制作根的子段,然后在根的子节点上递归调用 this 函数,依此类推。我在第二个段上得到了错误的内存分配。即当dimens = 2时,我不知道为什么会这样。我试图通过更改值和大小来修复它,但 Visual Studio 没有提供任何明显的错误,除了在某些内存位置分配错误的内存。

这里是分段函数:

 void MapTree::segment(Node * node)
{
while (node->oBo != true)
{
    int dimension = node->dimens;
    node->v1 = new Node(0, dimension/2, 0 , dimension/2);
    node->v2 = new Node(dimension/ 2, dimension, 0, dimension/ 2);
    node->v3 = new Node(0, dimension / 2  , dimension / 2, dimension);
    node->v4 = new Node(dimension / 2, dimension, dimension / 2, dimension);

    segment(node->v1);
    segment(node->v2);
    segment(node->v3);
    segment(node->v4);
}

最后但并非最不重要的一点是,为树指定的大小始终是 2 的幂,因此段总是会以一个接一个的大小结束

【问题讨论】:

  • 解决此类问题的正确工具是使用您的调试器,但不要在这样做之前询问 Stack Overflow,并告诉我们您在逐行检查代码时所做的所有观察.
  • TL;DR;您可能正在尝试使用未初始化的变量分配一些内存。

标签: c++ algorithm exception data-structures segment-tree


【解决方案1】:

没关系,我知道出了什么问题,我想我在这里的问题措辞不正确。但经过一些调试后,我发现了错误,循环再次从同一位置再次调用,因此内存分配无限。因为根节点->oBo 永远不会是真的,因此无限循环和错误的内存分配。

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2020-01-14
    • 1970-01-01
    • 2021-08-06
    相关资源
    最近更新 更多