从 class 调用函数时,箭头“->”分隔符崩溃

the arrow '->' separator is crashing when calling function from class

我正在为 class 开发一个项目,我正在使用 classes 和 class 类型的指针来调用 class 中的一些函数,但是它在 Code Blocks 和 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);
}

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

您必须使用 class a 对象的一些有效内存地址初始化指针。

可以做到以下几点,

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

在这种情况下。最好使用一些 smart_ptr 比如 std::shared_ptrstd::unique_ptr 这样你就不用担心手动释放资源了。

   a* ptr;
   a aobj_;
   ptr = &aobj_;
   ptr->set_X(5);
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

基本规则:创建一个指针(一个包含对象地址的变量,否则是 NULL(或 nullptr 自 2011 年起))正如 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;