нарушение доступа при изменении размера поля байтов в режиме отладки - PullRequest
0 голосов
/ 23 декабря 2018

У меня следующее определение сообщения

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 программы работают должным образом.

Это раздражает, так как я не могу проверить свое настоящее приложение в режиме отладки.

Есть идеи, в чем проблема?

(Среда: Windows 10, Protocol Buffers v3.6.1, VS 2017, через cmake)

(#define PROTOBUF_USE_DLLS добавлено в test.pb.h)

РЕДАКТИРОВАТЬ:

Я попытался снова со статическими связанными библиотеками вместо связанных с dymanic, и чем это работает также в режиме отладки.

1 Ответ

0 голосов
/ 24 декабря 2018

Возможное несоответствие CRT / кучи.Создайте protobuf в отладке (ссылка на отладочный VCRT) и статически связывайте его с protobuf (как рекомендуется в документации) с вашей отладочной сборкой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...