我刚开始学习 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();
为了说明这一点,我有一个 A.h 和 B.h 文件,我在其中声明“int valueA;”和“A * a;”分别。而且我知道没有指针可以更容易地完成此操作,但我正在尝试了解指针在这里的工作原理:D
最佳答案
A new_A = A(5);
a = &new_A;
在这里,您创建 new_A
,它是 process
的本地地址,并将其地址分配给 a
。当 process
函数结束时,new_A
超出范围并被销毁。现在 a
指向一个无效的对象。
这里真正的解决方案是不要像这样使用指针,但如果你真的必须这样做,为了在函数结束后有一些最后的东西,你需要动态分配它。使用 a = new A(5);
执行此操作。您需要确保在程序稍后的某个时刻删除一个;
,否则动态分配的内存将被泄漏。
关于c++ - C++中的指针;段错误错误 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912197/