2015-01-06 80 views
3

我在我的C++程序中有兩個類MaxsegtreeMinsegtree改變其他類的數據成員的類

Maxsegtree有2個私有數據成員PQ,其中內存在創建實例時動態分配。

Minsegtree有類似的2個數據成員AB

當我呼叫類Minsegtree的成員函數時,MaxsegtreeA的數據成員的值正在發生變化。

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

你應該遵循你的課堂上的三條規則;如果您定義了析構函數,複製構造函數或複製賦值運算符,則應該定義全部三個。就目前而言,編譯器生成的拷貝構造函數和拷貝賦值操作符將不知道複製指針的分配,所以當拷貝被破壞時它將刪除拷貝它的對象所使用的內存。這會調用未定義的行爲。您可能會意外複印,導致此問題。 (或者只是使用'std :: vector '而不是管理自己的指針。) – cdhowie

+0

@cdhowie感謝您的快速回復。使用矢量似乎是個好主意。 – Ravi

回答

2

很可能您正在訪問超出限制的數組。

通過使用std::vector而不是原始指針和使用.at()而不是[]進行訪問來添加支票。這樣的代碼:

B[node] = l; 

例如成爲

B.at(node) = l; 

這樣,如果你訪問一個std::out_of_range會拋出異常的限制之外。

使用vector而不是手動分配的數組也會考慮到複製構造函數和賦值的正確實現,以防萬一最終使用它們。

+0

不,數組訪問在極限內。問題是由於析構函數。我已經刪除了析構函數並使用了vector。正確版本[link] http://ideone.com/gvizHc [link] – Ravi

+1

編號數組訪問超出限制;我嘗試了輸入10 + 1 10 2 9 3 8 4 7 5 6,'.at'調用確實如預期那樣拋出了超出範圍的異常。 – 6502

1

您正在訪問Minsegtree :: build_mintree中的超出範圍的內存位置。手動檢查或使用valgrind,start的好地方。

1

build_mintree,的node值可能超過2*N如果N不是2的冪(例如,用於n=18它進入上述40),因爲樹變得稀疏。

相關問題