将数字传递给成员函数会导致程序崩溃
Posted
技术标签:
【中文标题】将数字传递给成员函数会导致程序崩溃【英文标题】:Passing a number into member function causes program crash 【发布时间】:2015-08-12 20:52:39 【问题描述】:我刚开始学习指针以及它们如何作为成员函数工作。我开始玩了一下,最终写了一小段代码:
class Animal
private:
int *itsAge = 0;
int *itsWeight = 0;
public:
void SetAge(int age) *itsAge = age; ;
int GetAge() return *itsAge; ;
;
int main()
Animal Lion;
Lion.SetAge(3);
cout << Lion.GetAge();
return 0;
;
我的问题是为什么我的程序在运行时会崩溃?在我看来,我将数字 3 按值传递给 SetAge() 函数。然后,值 3 的副本存储在 age 中,然后将其分配给指针 itsAge 的值。是因为 itsAge 从未分配过地址吗?如果是这样,这是否意味着将 itsAge 初始化为 0,并没有真正准备好要使用的指针?
【问题讨论】:
为什么将itsAge
和itsWeight
声明为指针?
我建议放弃类和成员函数,先了解指针的工作原理。
【参考方案1】:
将你的程序改写为:
struct Animal
int age = 0;
int weight = 0;
;
int main()
Animal lion;
lion.age = 3;
std::cout << lion.age;
return 0;
;
不需要指针。仅供参考,您的程序正在崩溃,因为您正在初始化指向 0
的指针,然后使用 *
取消对它们的引用,这是 Undefined Bevahiour。
【讨论】:
哦,好吧。是的,我知道一般指针作为成员变量是不必要的。我只是好奇为什么我的程序崩溃了。感谢您的洞察力! 哦,快速提问。它是否会导致未定义的行为,因为编译器会先读取 *itsAge,然后再将 age 的值分配给它?只是好奇编译器为了完成赋值操作而经历的操作顺序。 @Jason 在int *itsAge = 0;
中,您正在初始化一个指向地址0
的指针,该地址通常是保留的。这意味着当您执行*itsAge
时,您是在告诉您的程序查看地址为0
的内存块,这会触发操作系统错误。
哦,好吧,从来没有意识到 0 代表一个地址。非常感谢!以上是关于将数字传递给成员函数会导致程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何将指向成员函数的指针传递给 OpenCV 中的 setMouseCallback?