我正在为一个类的项目工作,我正在使用类和类的类来调用类中的一些函数,但它在代码块和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);
}
答案 0 :(得分:4)
a *Ptr; Ptr->set_X(5);
您的Ptr
没有指向任何内容。尝试在未初始化的指针上调用成员函数会导致未定义的行为。崩溃只是可能发生的随机事情之一。
幸运的是,在你的例子中,你无论如何都不需要指针。你可以简单地写一下:
a my_a;
my_a.set_X(5);
指针通常指向动态分配的对象。如果这是您想要的,则必须相应地使用new
和delete
:
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_ptr
或std::unique_ptr
这样的smart_ptr,这样您就不必担心手动释放资源了。
或者
a* ptr;
a aobj_;
ptr = &aobj_;
ptr->set_X(5);