为什么矢量函数push_back似乎重写了我的堆栈空间?

时间:2019-01-09 06:48:49

标签: c++ stl

在递归函数中使用std :: vector的push_back函数时遇到问题。使用push_back之后,我的堆栈空间中的某些变量似乎已被重写。

这是我的代码:

    class treap {

        public:

            struct t { int k, p, c, s; t *ch[2]; };
            vector<t> ts;
            t *h = NULL;
            t **f = NULL;

            t* nt() {
                t a;
                if (f)
                    cout << "1:" << (**f).k<<endl;
                ts.push_back(a);
                if (f)
                    cout << "2:" << (**f).k<<endl;
                return &ts.back();
            }

            t* ins(t *n, int k) {
                if (!n) {
                    t *a = nt(); a->k = k; a->p = rand();
                    a->c = a->s = 1; a->ch[0] = NULL; a->ch[1] = NULL;
                    return a;
                }
                f = &n;
                n->ch[0] = ins(n->ch[0], k);
                return n;
            }

    };

    int main() {
        treap *t = new treap();
        t->h = t->nt(); t->h->k = 5; t->h->p = rand();
        t->h->c = t->h->s = 1; t->h->ch[0] = t->h->ch[1] = NULL;
        t->h = t->ins(t->h, 2);
        delete(t); return 0;
    }

我的计算机上的结果是

    1:5
    2:6143928
首先,我调用函数ins()访问k属性为5的节点。然后,使用指针f指向当前n。之后,我递归调用ins()。现在,当前n为NULL。所以我叫函数nt()。然后在其中声明类型为t的变量a。然后,在我调用push_back(t)之后,指向的n f点似乎已被重写。

我很困惑,我衷心希望有人能帮忙。

更新:我忘了解释为什么编写此代码。我正在尝试建立一棵树。并使用向量存储所有节点。现在,我认为错误可能是因为push_back实际上是内存的重新分配,并且此操作将更改变量的内存位置。

0 个答案:

没有答案