如何修复 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()
的数据。它要么没有以您假定的形式编码(一个长度,后跟该字符数),要么调用者正在走过提供的缓冲区的末尾。可能两者都有。
在任何一种情况下,如果调用方使用返回的指针,都会表现出未定义的行为。
但是,由于您没有提供调用代码,因此无法提供解决问题的建议。
我正在尝试为 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()
的数据。它要么没有以您假定的形式编码(一个长度,后跟该字符数),要么调用者正在走过提供的缓冲区的末尾。可能两者都有。
在任何一种情况下,如果调用方使用返回的指针,都会表现出未定义的行为。
但是,由于您没有提供调用代码,因此无法提供解决问题的建议。