【问题标题】:Segmentation fault while trying to get value from another class object尝试从另一个类对象获取值时出现分段错误
【发布时间】:2018-06-30 13:43:23
【问题描述】:

我创建了几个类来介绍我的问题。我在尝试从指针位于 Storage 类中的对象中获取数据时收到 segmentation fault 错误。本程序保存First类类型的单指针,可以保存FirstChild类对象地址。 FirstChild 类继承自 First 类。

所以,我创建了两种方法来从对象中获取数据。第一个(getNumbers())是返回变量值的虚方法,第二个getNum() 调用getNumbers() 方法。

segmentation fault 错误表示我正在尝试访问我无权访问的内存。

但是还有其他方法可以获取这些值吗?

First.h

#ifndef FIRST_HPP
#define FIRST_HPP

class First {
  protected:
    int x;
  public:
    First(int x);
    virtual ~First();
    virtual int getNumbers();
 }

#endif

First.cpp

#include "First.h"

First::First(int x) : x(x){}
int First::getNumbers(){
  return this->x;
}
First::~First(){}

FirstChild.h

#ifndef FIRST_CHILD_HPP
#define FIRST_CHILD_HPP

class FirstChild : public First {
  private:
   int y;
  public:
    FirstChild(int x, int y);
    virtual int getNumbers();
 }

#endif

FirstChild.cpp

#include "FirstChild.h"

FirstChild::FirstChild(int x, int y) : First(x), y(y){}
int FirstChild::getNumbers() {
 return this->x + this->y; 
}

Storage.h

#ifndef STORAGE_HPP
#define STORAGE_HPP

#include "First.hpp"

class Storage {
  private:
    First * somePtr;
    int z;

  public:
    Storage(First * ptr);
    int getNum();
 }

#endif

Storage.cpp

#include "Storage.h"

Storage::Storage(First * ptr) {
this->somePtr = ptr;
}

int Storage::getNum(){
 return this->somePtr->getNumbers(); //Segmentation fault (core dumped)
}

ma​​in.cpp

#include <iostream>
#include "First.h"
#include "FirstChild.h"
#include "Storage.h"

int main(){

First * firstPtr;
FirstChild FchObject(10);

firstPtr = &FchObject;

Storage storage(firstPtr);
storage.getNum();  //Segmentation fault

return 0;
}

【问题讨论】:

  • 通常这是一个迹象,您应该将其弹出到您的调试器中,以加速到崩溃点并查看原因。
  • Storage.getNum(); 不是有效的语法。这不应该编译,所以它不会崩溃。
  • 为什么你的getNum()实现的签名不匹配?这些是如何工作的?
  • 不编译 - “FirstChild FchObject(10);”,错误:没有匹配函数调用 'FirstChild::FirstChild(int)' ...您提供的 ctor 有两个参数。
  • “但它编译” - 你看到什么表明编译没有错误?您希望错误消息显示在哪里……它们可能是其他屏幕或窗口吗?工具? (g++ v?, clang++ v?) 或 Visual 之类的?

标签: c++ c++11 dynamic-memory-allocation


【解决方案1】:

和其他人一样,我不明白这一行是如何编译的,因为 getNum() in 应该需要一个实例:

Storage.getNum();  //Segmentation fault

试试这个:

Storage myStorage(firstPtr);
myStorage.getNum();

【讨论】:

  • 我将指针发送到Storage 类的构造函数中的实例。我正在这个指针上执行getNum() 方法。
  • @sqlMasterSOon - 不,你不是。
【解决方案2】:

您的代码无法按原样编译,main() 中出现 3 个语法错误:

FirstChild FchObject(10);

因为构造函数的签名是 FirstChild(int x, int y),所以 this 必须有两个参数,例如

FirstChild  FchObject(5, 10);

Storage 类缺少变量的正确声明

firstPtr = &FchObject;
Storage  variable_name(firstPtr);

非静态方法的调用需要一个 before 类的实例。运营商:

variable_name.getNum(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多