访问导致seg错误的私有成员

时间:2014-07-24 12:08:41

标签: c++ class

下面的代码运行正常,但如果我尝试访问函数m_sal中的私有成员变量fun(),则会导致分段错误。

任何人都可以解释原因吗?

class Emp
{
    int m_sal;
public :
    void fun(char* name)
    {
        std::cout<<"Name :"<<name<<std::endl;
    }
};

int main()
{
    Emp *e = NULL;
    e->fun("Hi");
    return 0;
}

4 个答案:

答案 0 :(得分:1)

通过NULL指针调用方法 - 正如您所做的那样 - 是未定义的行为。所以它可能崩溃,而不是崩溃,做任何事情。

答案 1 :(得分:0)

首先,您可能希望将方法的签名更改为

void fun (const char* name) const;

不推荐将"Hi"转换为char *且const正确性为highly recommended。您的崩溃是由人们通过在空指针上调用您的方法提到的。尝试

Emp * e = new Emp;
e->fun("Hi");

代替。

答案 2 :(得分:0)

当然它崩溃了。

Emp *e = NULL;

创建一个恰好是空指针的指针(由于= NULL,但我相信我们中的许多人更喜欢= nullptr),因此没有为它指向的对象分配内存至。您需要创建一个指针指向的对象:

Emp* e = new Emp;

现在你可以使用它。

崩溃的确切原因是应用程序试图从非常低的内存地址获取值(指针的值为0,在某些情况下,可能为C ++对象的正确内存布局添加一些填充字节,但在这种情况下,它很可能只想读取地址为0的内存,在大多数情况下,系统会保留OS以供系统使用。

答案 3 :(得分:0)

在您的代码中,e是一个指针,而不是一个对象的实际实例。你可以有:

Emp e;
e.fun("Hi");
//No need to clean up stack variable

OR

Emp *e = new Emp;
e->fun("Hi");
delete e;   //don't forget to clean up!

由于使用空指针调用函数,所以你所拥有的是未定义的行为。