我具有以下消息定义
syntax = "proto3";
message TestMessage {
fixed32 id = 1;
bytes data = 2;
}
当我在调试模式下运行以下程序时,出现访问冲突。
#include <cstdint>
#include "test.pb.h"
int main(int argc, char *argv[])
{
TestMessage msg;
msg.set_id(4711);
std::string* dataString = msg.mutable_data();
dataString->resize(100000); // access violation here
std::cout << (*dataString) << std::endl;
std::string str;
std::getline(std::cin, str);
}
即使在以下情况下,也会在DEBUG模式下引发访问冲突。
#include <cstdint>
#include "test.pb.h"
int main(int argc, char *argv[])
{
TestMessage msg;
msg.set_id(4711);
std::string* dataString = msg.mutable_data();
dataString->append("Hello, World!");
dataString->append("Hello, World!");
dataString->append("Hello, World!"); // access violation here
dataString->append("Hello, World!");
std::cout << (*dataString) << std::endl;
std::string str;
std::getline(std::cin, str);
}
在“释放”模式下,程序按预期运行。
这很烦人,因为我无法在调试模式下测试我的真实应用。
有什么问题吗?
(环境:Windows 10,协议缓冲区v3.6.1,VS 2017,通过cmake)
({#define PROTOBUF_USE_DLLS
已添加到test.pb.h)
编辑:
我再次尝试使用静态链接库而不是动态链接库,然后在DEBUG模式下也可以使用。
答案 0 :(得分:0)
可能的CRT /堆不匹配。在调试中构建protobuf(链接到调试VCRT),并使用调试版本静态链接protobuf itslef(在文档中建议)。