【问题标题】:Pointers in C++; segmentation fault error:C++ 中的指针;分段错误错误:
【发布时间】:2013-02-16 15:59:33
【问题描述】:

我刚刚开始学习 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(正确)和分段错误。谁能帮我理解为什么会这样?根据我目前对指针的理解,我做对了吗?

int main(void) {

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

}


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

【问题讨论】:

  • 你在类定义后缺少分号,你不应该在类定义内部使用Class::Method
  • 我已经编辑了格式化代码,同时保持错误不变。
  • @MartinshShaiters:不,你没有。
  • 我在任何一个类中都没有看到任何成员变量声明,并且这个 B b_object(); 没有创建对象。所以很明显你是在遗漏代码或编造一些东西。请剪切并粘贴您的确切代码和确切的错误消息。
  • @LightnessRacesinOrbit 至少我是这么认为的。

标签: c++ pointers segmentation-fault


【解决方案1】:
 A new_A = A(5);
 a = &new_A;

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

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

【讨论】:

  • 我想你把手指放在它上面 - 当它超出范围时会被破坏。
  • 我想我现在明白了,至少为什么它不起作用。而且,是的,你是对的,做“a = new A(5);”解决问题。但是有没有办法创建 A 的新实例(比如 new_A)并更新指针 (a) 以指向这个新实例?
  • @FranXh 这就是你之前所做的。问题是对象的生命周期比指针的生命周期短。指针继续指向对象曾经所在的位置,即使在对象超出范围后也是如此。确保对象的生命周期足够长的另一种方法是通过引用将其传递给process。然后,您可以获取该引用的地址,只要被引用的对象持续足够长的时间,就可以了。
  • 好的,我明白你的意思了。但是我尝试动态分配空间,现在它可以工作了。我可以做这样的事情还是这是糟糕的设计技术?无效 B::process(){ A new_A = A(5); a = new A;//动态分配空间 (*a) = A; new_A.displayInfo();一个->显示信息(); }
  • @FranXh 这有点傻,因为你还不如只做a = new A(5); 而根本不用new_A
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我已经在我的 B.h 文件中声明了它,因此 a 不是本地的
    • 您可能应该在代码片段中显示相关信息(变量声明)。变量范围可能是这里的罪魁祸首。
    猜你喜欢
    • 2013-09-18
    • 2016-02-24
    • 2012-04-10
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多