首页 > 解决方案 > 在调试模式下调整字节字段大小时访问冲突

问题描述

我有以下消息定义

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)

编辑:

我再次尝试使用静态链接库而不是动态链接,并且它也可以在调试模式下工作。

标签: c++protocol-buffers

解决方案


可能的 CRT/堆不匹配。在调试中构建 protobuf(针对调试 VCRT 的链接)并在 protobuf itslef 中静态链接(如文档中推荐的那样)与您的调试构建。

请参阅: https ://docs.microsoft.com/en-us/cpp/c-runtime-library/potential-errors-passing-crt-objects-across-dll-boundaries?view=vs-2017


推荐阅读