【问题标题】:How can I fix a segmentation fault on C++如何修复 C++ 上的分段错误
【发布时间】:2015-07-15 04:37:19
【问题描述】:

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

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

【问题讨论】:

  • 通过调试器运行它时看到了什么?
  • reinterpret_cast 有味道。
  • 没有完整的程序很难说,但是指针算法看起来很可疑(并且有点未定义)。它的目的是什么?您的意见是什么?
  • 由于程序坏了,我们无法通过阅读它来确定它应该做什么。 因为它不做那件事。解释你的目标。
  • "我已经尝试以管理员身份运行它" - 如果您的程序有未定义的行为,这是您最不想尝试的事情。

标签: c++ segmentation-fault


【解决方案1】:
 char* CutPrefix(char* data);

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

我的猜测是你写错了这行:

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

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

【讨论】:

  • “你从来没有为字符串上的那个指针分配内存”你怎么知道?
  • @LightnessRacesinOrbit 被淘汰,要么是未分配,要么是误算了一个 Lrio'。
  • 那你为什么要严格断言它必须只是其中之一?指针无效的原因有很多,而问题甚至可能不是无效指针。
【解决方案2】:

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

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

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

由于您尚未提供调用代码,因此无法就如何解决问题提供建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2019-03-31
    相关资源
    最近更新 更多