【发布时间】: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)
}
main.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