我在我的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;
}
可能有人請告訴我,我做錯了什麼?
你應該遵循你的課堂上的三條規則;如果您定義了析構函數,複製構造函數或複製賦值運算符,則應該定義全部三個。就目前而言,編譯器生成的拷貝構造函數和拷貝賦值操作符將不知道複製指針的分配,所以當拷貝被破壞時它將刪除拷貝它的對象所使用的內存。這會調用未定義的行爲。您可能會意外複印,導致此問題。 (或者只是使用'std :: vector'而不是管理自己的指針。) –
cdhowie
@cdhowie感謝您的快速回復。使用矢量似乎是個好主意。 – Ravi