c++ - 在调试模式下调整字节字段大小时访问冲突
问题描述
我有以下消息定义
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);
}
甚至以下在调试模式下也会引发访问冲突。
#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);
}
在 RELEASE 模式下,程序按预期工作。
这很烦人,因为我无法在 DEBUG 模式下测试我的真实应用程序。
任何想法是什么问题?
(环境:Windows 10,Protocol Buffers v3.6.1,VS 2017,通过 cmake)
(#define PROTOBUF_USE_DLLS
添加到 test.pb.h)
编辑:
我再次尝试使用静态链接库而不是动态链接,并且它也可以在调试模式下工作。
解决方案
可能的 CRT/堆不匹配。在调试中构建 protobuf(针对调试 VCRT 的链接)并在 protobuf itslef 中静态链接(如文档中推荐的那样)与您的调试构建。
推荐阅读
- r - 传递不带反引号的运算符
- reactjs - React 限制 api 结果并查看更多项目
- spring-boot - 应用程序运行失败 org.springframework.beans.factory.BeanDefinitionStoreException:无法读取候选组件类:
- vuejs2 - Quasar:Vue.js 语法的使用(Vue 实例和 Vue.component)
- html - 如何禁用 Chrome 中的辅助菜单“翻译成葡萄牙语/英语”
- reactjs - 使用带有 React Context Provider 和 Hooks 的 JestJs 编写测试
- android - 鼠标滚动在 SliverAppbar() 或 SliverAppbar() 上不起作用 Flutter Web 浮动不起作用
- c# - 收到错误消息数据为空。不能对 Null 值调用此方法或属性。在 FromSqlRaw
- python-3.x - 从 2 个 1D 数组中获取 2D 数组(Python)
- javascript - 为什么点击展开 javascript 在第一个内容之后不起作用?