0

我刚刚开始学习 C++,现在我正在使用指针。我不明白为什么会发生以下事情。

所以,假设我有两个类 A 和 B。A 有一个整数字段(int valueA),B 有一个指针字段(指向 A),A *a。下面我展示了这两个类。

class A{
   A::A(int value){
    valueA = value;
}


 void A::displayInfo (){
      cout<<A<<endl;
    }
 }



class B{

    B::B(){
    a=0;
  }


  void B::printInfo (){
       a -> displayInfo(); //Segmentation fault
     }

  void B::process(){
     A new_A = A(5);
     a = &new_A;
     new_A.displayInfo(); //correct output
     a -> displayInfo();  //correct output
     }
  }

现在,在我的主类中,我执行以下操作:创建 B 类的实例并调用 process() 和 print() 函数。在输出中我得到:5(正确)、5(正确)和分段错误。谁能帮我理解为什么会这样?根据我目前对指针的理解,我做对了吗?

诠释主要(无效){

B b_object();
b_object.process();
b_object.print();

}


为了清楚起见,我有一个 Ah 和 Bh 文件,我在其中声明“int valueA;” 和“A *a;” 分别。而且我知道没有指针可以更轻松地完成此操作,但我正在尝试了解指针如何在这里工作:D

4

3 回答 3

3
 A new_A = A(5);
 a = &new_A;

在这里,您创建new_A本地process并将其地址分配给a. 当process函数结束时,new_A超出范围并被销毁。现在a指向一个无效对象。

这里真正的解决方案是不使用这样的指针,但如果你真的必须使用,为了在函数结束之后有一些东西,你需要动态分配它。用a = new A(5);. 您需要确保您delete a;在程序的某个稍后时间点,否则动态分配的内存将被泄漏。

于 2013-02-16T16:11:21.047 回答
0

a 在 process() 中分配给局部变量,因此在 printInfo() 中无效

于 2013-02-16T16:02:22.863 回答
0

该变量a是您的方法的本地变量 - 在类级别声明它

于 2013-02-16T16:03:37.313 回答