从 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_ptr
或 std::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);
指针通常指向动态分配的对象。如果这是你想要的,你必须相应地使用 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
基本规则:创建一个指针(一个包含对象地址的变量,否则是 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;
我正在为 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_ptr
或 std::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);
指针通常指向动态分配的对象。如果这是你想要的,你必须相应地使用 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
基本规则:创建一个指针(一个包含对象地址的变量,否则是 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;