尝试从方法返回指向对象的指针时出现分段错误

Posted

技术标签:

【中文标题】尝试从方法返回指向对象的指针时出现分段错误【英文标题】:Segmentation fault while trying to return a pointer to object from a method 【发布时间】:2016-06-06 11:06:21 【问题描述】:

g++ 在我尝试从 classA 的方法返回 classB 的对象时抛出“分段错误”。我不知道如何解决这个错误,如果有人能告诉我为什么会发生这个错误,我将不胜感激。 所以...这是代码:

classA.h

#include "classB.h"
#ifndef _CLASS_A_H_
#define _CLASS_A_H_
class ClassA
private:
    int id;
    ClassB *ptr_classB;
public:
    ClassA();
    ClassA(int id, std::string name);

    inline void setID(int id)this->id = id;

    inline int getID()return this->id;

    inline ClassB getClassB()return this->ptr_classB;

;

#endif

classA.cpp

#include "classA.h"
#include "classB.h"

ClassA::ClassA()
    this->id = 0;
    ptr_classB = new ClassB();

classB.h

#ifndef _CLASS_B_H
#define _CLASS_B_H

class ClassB
private:
    std::string name;
public:
    ClassB();
    inline std::string getName()return this->name;
;
#endif

classB.cpp

#include <string>
#include "classB.h"

ClassB::ClassB()
    this->name = "default";

main.cpp

#include <iostream>
#include "classA.h"

using namespace std;

int main()
    ClassA *ptr_classA = new ClassA();

    cout << ptr_classA->getClassB().getName()  << endl;
    //asd

    return 0;

生成文件

src = src

INC = 包括

OBJ = 对象

BIN = bin

LIB = 库

CXX = g++

CPPFLAGS = -c -I$(INC)/ -std=c++11

全部:$(BIN)/main

$(BIN)/main: $(OBJ)/main.o

$(CXX) -o $(BIN)/main $(OBJ)/main.o -Llib/ -lclasses

$(OBJ)/main.o: $(SRC)/main.cpp

$(CXX) $(CPPFLAGS) $(SRC)/main.cpp -o $(OBJ)/main.o

$(OBJ)/classA.o: $(SRC)/classA.cpp $(INC)/classA.h $(INC)/classB.h

$(CXX) $(CPPFLAGS) $(SRC)/classA.cpp -o $(OBJ)/classA.o

$(OBJ)/classB.o: $(SRC)/classB.cpp $(INC)/classB.h

$(CXX) $(CPPFLAGS) $(SRC)/classB.cpp -o $(OBJ)/classB.o

$(LIB)/libclasses.a: $(OBJ)/classA.o

ar rsv $(LIB)/libclasses.a $(OBJ)/classA.o 

【问题讨论】:

该代码无法编译,更不用说运行和崩溃了。请发布您确定实际表现出问题行为的代码。不要从记忆中重新输入,使用复制和粘贴。 不要#include .cpp 文件。 内联 ClassB getClassBObject(return &ptr_classb;); ---> 您正在返回 ClassB 类型指针的地址。您实际上应该只返回 ClassB *。像这样的内联 ClassB getClassBObject(return this->ptr_classb;) inline ClassB getClassB()return *(this-&gt;ptr_classB);替换inline ClassB getClassB()return this-&gt;ptr_classB; @Guiroux 仍然有段错误 【参考方案1】:

清理代码:

class ClassA ;
class ClassB ;

class ClassB
private:
    int n;
public:
    ClassB();
    inline void set_n(int n)this->n =n;
    inline int get_n()return this->n;

;

class ClassA
private:
    ClassB *ptr_classb;
public:
    ClassA();
    inline ClassB getClassBObject()return *ptr_classb;
;

ClassB::ClassB()
    this->n = 0;


ClassA::ClassA()
    ptr_classb = new ClassB();


#include <iostream>

int main()
    ClassA *ptr_classA = new ClassA();

    std::cout << ptr_classA->getClassBObject().get_n() << std::endl;

    return 0;

在编译时纠正错误后编译和执行正常,这让我想知道:你到底是如何设法编译这个得到段错误的?

【讨论】:

你的代码没有,我的代码是的,但是如果我上传我的文件,它是相同的代码 xD,你会看到它们吗? 你是什么意思?上传到哪里? 我会把它们放在这里。 这不能回答问题。 @BlackB0ltz 与您显示的代码不同。那甚至无法编译。

以上是关于尝试从方法返回指向对象的指针时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用指向 char* 的指针时出现总线错误 10 或分段错误 11,具体取决于封装

使用指向指针 C++ 的指针时出现分段错误

添加指向数组的指针时出现分段错误

返回指针时出现分段错误[关闭]

删除时出现分段错误

返回指针时出现分段错误[重复]