类更改数据其他类的成员

Class changing data members of other class

本文关键字:成员 其他 数据      更新时间:2023-10-16

我的C++程序中有两个类MaxsegtreeMinsegtree

Maxsegtree 有 2 个私有数据成员PQ,内存在创建实例时动态分配。

Minsegtree 具有类似的 2 个数据成员AB

当我调用类 Minsegtree 的成员函数时,Maxsegtree A的数据成员的值正在更改。

这是程序的 ideone 链接。

#include <iostream>
using namespace std;
class Maxsegtree
{
    int* P;
    int* Q;
public:
    Maxsegtree(int N)
    {
        P = new int[N];
        Q = new int[2 * N];
    }
    ~Maxsegtree()
    {
        delete[] P;
        delete[] Q;
    }
    int getP(int i)
    {
        return P[i];
    }
    void setP(int i, int x)
    {
        P[i] = x;
    }
    void build_tree(int node, int l, int r)
    {
        if (l == r)
            Q[node] = l;
        else
        {
            build_tree(node * 2, l, (l + r) / 2);
            build_tree(node * 2 + 1, (l + r) / 2 + 1, r);
            if (P[Q[2 * node]] > P[Q[2 * node + 1]])
                Q[node] = Q[2 * node];
            else
                Q[node] = Q[2 * node + 1];
        }
    }
};
class Minsegtree
{
    int* A;
    int* B;
public:
    Minsegtree(int N)
    {
        A = new int[N];
        B = new int[2 * N];
    }
    ~Minsegtree()
    {
        delete[] A;
        delete[] B;
    }
    int getA(int i)
    {
        return A[i];
    }
    void setA(int i, int x)
    {
        A[i] = x;
    }
    void build_mintree(int node, int l, int r)
    {
        if (l == r)
            B[node] = l;
        else
        {
            build_mintree(node * 2, l, (l + r) / 2);
            build_mintree(node * 2 + 1, (l + r) / 2 + 1, r);
            if (A[B[2 * node]] <= A[B[2 * node + 1]])
                B[node] = B[2 * node];
            else
                B[node] = B[2 * node + 1];
        }
    }
};
int main()
{
    int n;
    int x;
    cin >> n;
    Minsegtree mint(n);
    Maxsegtree maxt(n);
    for (int i = 0; i < n; i++)
    {
        cin >> x;
        mint.setA(i, x);
        maxt.setP(i, x);
    }
    cout << "Before function is called" << endl;
    for (int i = 0; i < n; i++)
        cout << maxt.getP(i) << " ";
    cout << endl;
    mint.build_mintree(1, 0, n - 1);
    cout << "After function is called" << endl;
    for (int i = 0; i < n; i++)
        cout << maxt.getP(i) << " ";
    cout << endl;
    return 0;
}

有人可以告诉我我做错了什么吗?

很可能您正在访问超出限制的数组。

通过使用std::vector而不是原始指针以及使用.at()而不是[]进行访问来添加检查。代码如下:

B[node] = l;

例如成为

B.at(node) = l;

这样,如果您超出限制进行访问,则会引发std::out_of_range异常。

使用

vector s 而不是手动分配的数组还将注意复制构造函数和赋值的释放和正确实现,以防您最终使用它们。

您正在访问 Minsegtree::build_mintree 中的超出范围的内存位置。手动检查或使用valgrind,这是一个很好的起点。

build_mintree中,如果N不是 2 的幂(例如,对于 n=18 超过 40),node 的值可能会超过 2*N,因为树变得稀疏。