2014-09-04 47 views
-2

我已經寫在C++中有對象指針數組被傳遞給函數的參數作爲簡單的代碼波紋管代碼:如何將動態分配的指針數組(轉換爲對象)轉換爲指向對象的單個指針?

void foo1(myClass **obj1) 
{ 
    //some stuff here 
    foo2(obj[0]); 
} 

void foo2(myClass *obj) 
{ 
    //some other stuff here 
    cout<<"I'm here"<<endl; 
} 

main() 
{ 
    myClass **object 
    object= new *myClass[n]; 
    for(int i=0;i<n;i++) 
     object[i]=new myClass() 
    foo1(object); 
    cout<<"done"<<endl; 
} 

此代碼的工作,直到打印「我在這裏」並突然崩潰。我認爲指針數組的數組應該有問題,並且我將myclass **轉換爲myclass *。但我完全無法弄清楚問題所在。

編輯:我標記了foo2中的代碼和poof!它工作得很好。我奇怪的是它向我展示了執行行可以傳遞代碼並執行一些行(例如cout < <「我在這裏」),儘管之前已經達到了非法的內存訪問錯誤。我對麼?

+2

發佈完整的可編譯示例。 – 2014-09-04 22:03:32

+0

myClass的外觀如何? – 2014-09-04 22:07:46

+0

除非你有很好的理由,否則你不應該在C++中使用指針。 – 2014-09-04 22:15:09

回答

1

示例代碼充斥着多個輸入錯誤和錯誤,以防止它被編譯。固定所有的錯別字產生下列結果:

#include <iostream> 
using namespace std; 
class myClass {}; 

void foo2(myClass *obj) 
{ 
    //some other stuff here 
    cout<<"I'm here"<<endl; 
} 

void foo1(myClass **obj) 
{ 
    //some stuff here 
    foo2(obj[0]); 
} 

main() 
{ 
    myClass **object; 
    int n=10; 
    object= new myClass *[n]; 
    for(int i=0;i<n;i++) 
     object[i]=new myClass(); 
    foo1(object); 
    cout<<"done"<<endl; 
} 

此跑沒有崩潰,而Valgrind的顯示沒有非法存儲器存取或任何其它問題(沒有內存泄漏)。

無論你的問題是什麼,是在別的地方。除了防止它被編譯的錯誤之外,這個代碼沒有問題。沒有答案是可能的,沒有看到如所宣稱的崩潰的可編譯代碼。

+0

在「我在這裏」之前是否存在任何非法內存訪問的可能性?我的意思是執行首先讀取並運行cout之前的行,如果有任何錯誤,則不應顯示。對? – Sina 2014-09-04 22:34:57

+0

它有編譯錯誤,是的。我認爲人們會知道編譯代碼的先決條件。 – Sina 2014-09-04 22:41:33

+0

隨時可能存在非法內存訪問。非法內存訪問不一定會導致應用程序立即停止。 'const char * foobar =「foobar」; const int * p = *(const int **)foobar;'嚴重違法,但是這會在大多數平臺上運行而不會崩潰,並且崩潰只會發生在程序的一些完全不同的部分,該部分試圖使用指針。歡迎來到C++。 – 2014-09-04 23:49:38

0

是的,我在使用未指定的變量空間時犯了一個錯誤,關於調整矢量大小。對於我來說目前非常令人驚訝的是,一個cout流可以做到這一點,而非法的內存訪問已經發生。

相關問題