2016-11-20 26 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;} 
相关问题