我试图为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
我怎么能解决这个问题?我不确定为什么它会给我一个分段错误,我尝试以管理员的身份运行它,但我真的不知道问题出在哪里。
答案 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()
的数据。它不是以您假设的形式编码(长度,后跟该字符数)或调用者走过提供的缓冲区的末尾。可能两者都有。
在任何一种情况下,如果使用返回的指针,调用者将表现出未定义的行为。
但是,由于您还没有提供调用代码,因此无法就如何解决问题提出建议。