2015-04-29 6 views
0

Я запускаю Segfault при использовании буферов протокола с подчиненными сообщениями. Я не могу опубликовать весь свой код, поэтому я пытаюсь привести пример.Настройка прошивки Protobuf или встроенного сообщения и возврат объекта сообщения

Код .proto что-то вроде этого:

Message { 
    optional int id = 1; 
    optional SubMessage submsg = 2; 
} 

SubMessage { 
    optional int foo = 1; 
} 

В C++ код У меня есть функция, которая создает и возвращает SubMessage к другой функции, которая встраивает в SubMessage в сообщение и возвращает один к Иная функция ...

SubMessage createSubMessage() { 
    SubMessage smsg; 
    smsg.set_foo(12); 
    return smsg; 
} 

Message createMessage() { 
    Message msg; 
    // with this line i get the segfault, without not 
    SubMessage* smsg = msg.mutable_submsg(); 
    // I get the segfault no matter if i actually 
    // set the submessage or not. 
    // smsg.CopyFrom(createSubMessage(); 
    return msg; 
} 

void foo() { 
    for(;;) { 
     Message msg; 
     msg = createMessage(); 
    } 
} 

И ошибка я получаю исходит от SubMessage :: MergeFrom()

[libprotobuf FATAL messges_pb.cc:1128] CHECK failed: (&from) != (this): 
Segmentation fault 

Segfault интересно появляется на второй итерации цикла, при втором присвоении msg.

Я уже пробовал много путаницы, выделяя SubMessage в куче и устанавливая его с помощью set_allocated_submsg(), CopyFrom(), MergeFrom(), конструкторов копирования и т. Д. ... Я все еще сталкиваюсь с тем же проблема.

+0

Я не думаю, что ваш пример кода на самом деле демонстрирует проблему - я не вижу причин, по которым она должна приводить указанную вами ошибку. Я подозреваю, что реальная проблема существует только в вашем реальном коде, а не в примере. Не могли бы вы попытаться создать полную, самодостаточную примерную программу, которую мы можем скомпилировать (например, включая функцию 'main()'), которая показывает проблему? –

ответ

0

Я думаю, что ваш var msg в функции createMessage() уничтожен и disallocated после возвращения функции.

Вы должны попытаться использовать msg как атрибут своего основного класса.

+0

№ Как написано, код в порядке, потому что он возвращает объекты по значению (не ссылку или указатель). Возврат по значению будет медленным, потому что все сообщение нужно будет скопировать, но оно не должно терпеть крах. –

Смежные вопросы