2012-10-10 51 views
1

以下是我正面臨的問題的一個小規模示例。在下面的例子中,我使用了int指針,但是在我自己的代碼中,我真的使用了指向另一個類(節點類)的指針。

問題似乎是我正在使用值指針調用(如果有這樣的事情)。我不知道,我認爲指針是通過引用。
我確實需要能夠將多個指針傳遞給該方法,而我並不想爲每個指針編寫特定的方法。
當我運行代碼時,當然,我得到某種錯誤,因爲它試圖訪問尚未分配的指針。 我不明白爲什麼它不會初始化正確的指針,如果我通過我想要的特定指針。C++類指針不保存任何內容。

任何幫助將不勝感激。

#include <iostream> 

using namespace std; 

class Test { 
    private: 
    int *p1; 
    int *p2; 
    int sizeP1; 
    int sizeP2; 
    public: 
    int* getIntPointer() {return p1;} 
    void initializeP1(int *ip,int n){ 
     sizeP1=n; 
     ip=new int[n]; 

     for(int i=0;i<n;i++) 
      p1[i]=i;   
    } 
    void printP1() { 
     for(int i=0;i<sizeP1;i++) 
      cout<<p1[i]<<" "; 
    } 
}; 

int main() { 
    Test t; 
    t.initializeP1(t.getIntPointer(),10); 
    t.printP1(); //this fails.. but why? How can I fix it? 

    return 0; 
} 

回答

2

的問題是,你的函數分配內存的指針是參數的副本 - 這個副本是在函數退出丟失。通過而不是改變函數簽名

void initializeP1(int* &ip,int n){ 
         ^

這樣分配的內存仍然可以訪問你的指針將指向它通過引用傳遞指針

4

的問題是,你初始化ip和您填寫p1

void initializeP1(int **ip,int n){ 
     sizeP1=n; 
     *ip=new int[n]; 

     for(int i=0;i<n;i++) 
      *ip[i]=i;   
    } 
//call with p1 

initializeP1(&p1, 10); // pass pointer to pointer so you can get return value. 
+0

嗨託尼,我試過,但它不適合我。 – Markymark

+0

我不確定如何在此處正確地進行語法高亮顯示,但我確實已將其更改爲上面的顯示方式。唯一的區別是我的initializeP1方法在類內部,我稱它爲你在主要方法中顯示的方式。不過,我像這樣通過了p1。 int * p = t.getIntPointer(); t.initializeP1(&p,10); – Markymark

1

難道不是簡單的更容易你initializeP1功能更改爲類似:

int * initializeP1(int n) 
{ 
    sizeP1 = n; 
    p1 = new int[n]; 

    for(int i = 0; i < n; ++i) 
     p1[i] = i; 
    return ip; 
} 

但是,這仍然存在問題,例如您可以反覆調用並導致大量內存泄漏的事實。

這可能是更好地使用適當的構造函數的類,它做什麼initializeP1所做的,就像這樣:

Test(int n) 
{ 
    sizeP1 = n; 
    p1 = new int[n]; 

    for(int i = 0; i < n; ++i) 
     p1[i] = i; 
    return ip; 
} 

指針不是按引用傳遞,沒有。指針是值類型。如果你絕對必須使它看起來像這樣,你會想要使用一個引用,但這是一種濫用語法,你應該改用另一種方式。

0

對t.getIntPointer()的調用返回一個未初始化爲合理的指針。 對initializeP1()的調用正在創建一個int數組。 但是要小心,這個分配的內存塊不會被釋放,直到通過寫入「delete [] p1;」來告訴它。