如何在C ++上修复分段错误

时间:2015-05-05 12:33:22

标签: c++ segmentation-fault

我试图为amd64arch构建它并且它一直给我分段错误:

    #include "client.h"

      namespace {

    class SimpleClientImpl : public SimpleClient {
    private:
      int progress_counter_;

    public:
      SimpleClientImpl() : progress_counter_(0) {}

      int GetProgress() const;
      char* CutPrefix(char* data);
    };

    int SimpleClientImpl::GetProgress() const {
      return progress_counter_;
    }

    char* SimpleClientImpl::CutPrefix(char* data) {
      progress_counter_++;
      return data + *reinterpret_cast<size_t*>(data) + sizeof(size_t);
    }

    }  // namespace

    std::shared_ptr<SimpleClient> CreateSimpleClient() {
      return std::shared_ptr<SimpleClient>(new SimpleClientImpl);
    }

在client.h中,我得到了:

    #ifndef TEST_CLIENT_H_
    #define TEST_CLIENT_H_

    #include <memory>

    class SimpleClient {
    public:
      virtual int GetProgress() const = 0;
      virtual char* CutPrefix(char* data) = 0;
      virtual ~SimpleClient() {}
    };

    std::shared_ptr<SimpleClient> CreateSimpleClient();

    #endif

我怎么能解决这个问题?我不确定为什么它会给我一个分段错误,我尝试以管理员的身份运行它,但我真的不知道问题出在哪里。

2 个答案:

答案 0 :(得分:1)

 char* CutPrefix(char* data);

可能 永远不会为字符串上的指针分配内存(使用new或c malloc);

我的猜测是你错误地写了这句话:

return data + *reinterpret_cast<size_t*>(data) + sizeof(size_t);

如果您真的想继续使用cpp中的char *,那么您应该使用strings,或者在事先进行正确的分配。

答案 1 :(得分:0)

虽然您还没有显示调用代码,但可能会创建SimpleClientImpl并将某些字符缓冲区(地址)传递给CutPrefix()成员函数。可能反复。

检查提供给CutPrefix()的数据。它不是以您假设的形式编码(长度,后跟该字符数)或调用者走过提供的缓冲区的末尾。可能两者都有。

在任何一种情况下,如果使用返回的指针,调用者将表现出未定义的行为。

但是,由于您还没有提供调用代码,因此无法就如何解决问题提出建议。