箭头' - >'从类调用函数时分隔符崩溃

时间:2015-12-31 09:11:11

标签: c++ pointers c++11 function-pointers

我正在为一个类的项目工作,我正在使用类和类的类来调用类中的一些函数,但它在代码块和Eclipse上崩溃,我不知道发生了什么 注意在使用y

分配x时崩溃
#include <iostream>

using namespace std;

class a{
private:
    int x;
public:
    void set_X(int y){
        x=y;
    }
};

int main()
{
    a *Ptr;
    Ptr->set_X(5);
}

3 个答案:

答案 0 :(得分:4)

a *Ptr;
Ptr->set_X(5);

您的Ptr没有指向任何内容。尝试在未初始化的指针上调用成员函数会导致未定义的行为。崩溃只是可能发生的随机事情之一。

幸运的是,在你的例子中,你无论如何都不需要指针。你可以简单地写一下:

a my_a;
my_a.set_X(5);

指针通常指向动态分配的对象。如果这是您想要的,则必须相应地使用newdelete

a *Ptr = new a;
Ptr->set_X(5);
delete Ptr;

在现代C ++中,std::unique_ptr通常是一种更好的选择,因为您不必手动释放已分配的内存,从而消除了许多潜在的编程错误:

auto Ptr = std::make_unique<a>();
Ptr->set_X(5);
// no delete necessary

答案 1 :(得分:1)

基本规则:创建指针(包含对象地址的变量,或者自{2011年起为NULL(或nullptr)),正如Christian Hackl在评论中指出的那样)创建一个对应的指针(一个对象,其地址可以存储在指针中)。

更正式地说,Ptr是一个未初始化的指针。即使访问其值也会产生未定义的行为(例如some_other_pointer = Ptr)。要使运算符->正常工作,必须首先初始化指针,使其指向有效对象。

 a aobj;
 a *Ptr = &aobj;
 Ptr->set_X(42);   // OK

 a *Ptr2 = new a;
 Ptr2->set_X(42);    // OK
 delete Ptr2;

答案 2 :(得分:-1)

您刚刚声明了a*类型的指针变量,但它没有指向有效的内存地址。并且由于您通过更新数据成员的指针调用成员函数,因此您有段错误,因为this指针是NULL

您必须使用类a对象的某个有效内存地址初始化指针。

可以完成以下任务,

a* ptr = new a;
ptr->set_X(5);
// ...
delete ptr;

在这种情况下。最好使用像std::shared_ptrstd::unique_ptr这样的smart_ptr,这样您就不必担心手动释放资源了。

或者

   a* ptr;
   a aobj_;
   ptr = &aobj_;
   ptr->set_X(5);