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

How can I fix a segmentation fault on C++

我正在尝试为 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

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

 char* CutPrefix(char* data);

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

我猜你误写了这一行:

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

而且你应该使用 strings,或者如果你真的想在 cpp 中继续使用 char*,请事先正确分配。

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

检查提供给 CutPrefix() 的数据。它要么没有以您假定的形式编码(一个长度,后跟该字符数),要么调用者正在走过提供的缓冲区的末尾。可能两者都有。

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

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