我的C ++程序中有两个类Maxsegtree
和Minsegtree
。
类Maxsegtree
有2个私有数据成员P
和Q
,在创建实例时动态分配内存。
班级Minsegtree
有类似的2位数据成员A
和B
。
当我调用类Minsegtree
的成员函数时,Maxsegtree
A
的数据成员的值会发生变化。
This is the ideone link to the program.
#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;
}
有人可以告诉我我做错了吗?
答案 0 :(得分:2)
很可能你是在极限之外访问数组。
使用std::vector
而不是原始指针添加支票,并使用.at()
代替[]
进行访问。代码如:
B[node] = l;
例如成为
B.at(node) = l;
这样,如果您在限制之外访问,则会抛出std::out_of_range
异常。
使用vector
而不是手动分配的数组也会关注重新分配以及复制构造函数和赋值的正确实现,以防您最终使用它们。
答案 1 :(得分:1)
您正在访问Minsegtree :: build_mintree中的范围内存位置。手动检查或使用valgrind,start的好地方。
答案 2 :(得分:1)
在build_mintree
中,如果node
不是2的幂,则2*N
的值可能会超过N
(例如,对于n=18
,它超过40 ),因为树变得稀疏。