2016-11-20 51 views
0
#include <iostream> 

class C 
{ 
    private: 
     int *o; 
    public: 
     C(int &i) { *o = i;} 
     int* get_val() {return o;} 
}; 

int main() 
{ 
    int t = 9; 
    C c(t); 
    int* p = c.get_val(); 
    std::cout<<*p<<std::endl; 
    int* h = c.get_val();   //seg fault 
    std::cout<<*h<<std::endl; 

    int f = 25; 
    C g(f); 
    int* q = g.get_val();   //seg fault 
    std::cout<<*q<<std::endl;   

    return 0; 
} 

C類有兩個對象:'c'和'g'。 返回私有變量的指針第一次正常工作,但是,第二次調用時會導致seg錯誤。爲什麼這樣?在C++中,爲什麼返回不同對象的私有變量指針會導致分段錯誤?

因此,我評論了第二個調用,並試圖創建一個新的對象,並試圖返回私有變量的指針。儘管'g'是C類的另一個對象,但返回它會導致分段錯誤。爲什麼這樣?

+3

'C(int&i){* o = i;}'這表現出未定義的行爲,通過取消引用未初始化的指針。你可能意味着'o =&i;'。 [演示](http://rextester.com/CINTK58780) –

+0

謝謝,那可行! – Harikrishnan

回答

2

構造函數C :: C(int)不初始化成員變量o。它試圖通過* o = i寫入指針o,但由於o未初始化,結果是不可預知的。

1

C(int &i) { *o = i;} 

爲您分配之前指針,你尚未分配的空間。它應該已經:

C(int i):o(new int){o=i;} 

但分配內部類函數的內存要求,你需要對他們的系統應用delete/delete[]。那麼,這是爲了防止內存泄漏。總之你需要:

C::~C(){ 
    delete o; // Freeing the memory associated with each object 
} 

此外,我不能想到在您的實現中通過引用傳遞值的用例。所以我將C(int &i)更改爲C(int i)

1

根本沒有初始化C :: o。問題不在於你要返回私人指針;這是你分配給你沒有分配的內存。

下面是從gdb的輸出與8號線斷點(C的構造函數):

Breakpoint 1 at 0x400960: file tmp.cc, line 8. 

Breakpoint 1, C::C (this=0x7fffffffdd00, [email protected]: 9) at tmp.cc:8 
8   C(int &i) { *o = i;} 
$1 = (int *) 0x7fffffffddf0 
9 
9 

Breakpoint 1, C::C (this=0x7fffffffdce0, [email protected]: 25) at tmp.cc:8 
8   C(int &i) { *o = i;} 
$2 = (int *) 0x0 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400969 in C::C (this=0x7fffffffdce0, [email protected]: 25) at tmp.cc:8 
8   C(int &i) { *o = i;} 

在我的機器,在第一次調用成功,但第二個電話會導致段錯誤,因爲g.o爲0x0。

您應該在分配給* o之前初始化C :: o,例如。

C(int &i) : o(new int) { *o = i;} 
相關問題