Будет ли указатель, добавленный в повторяющееся поле, автоматически удален? - PullRequest
0 голосов
/ 15 января 2019

Предположим, в Google Protobuf определено это сообщение:

message address
{
    String street = 1;
    String name = 2;
}

message address_list
{
    repeated address addrs = 1;
}

И я добавлю адреса в список адресов, которые были выделены:

protobuf::address_list addrs;

for (int i = 1; i < 10; ++i)
{
    protobuf::address *addr = addrs.add_addrs();
    addr->set_street("foo");
    addr->set_name("bar");
}

Кто будет отвечать за удаление объектов, созданных с помощью new? Я знаю, что если вы используете функцию set_allocated, то protobuf позаботится об удалении, если вы не вызовете release, но как обстоят дела с повторяющимися полями?

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Кто будет отвечать за удаление объектов, созданных с помощью new?

Кто бы ни создал объект, используя new.

Вы создали объект, используя new, поэтому вы несете ответственность за его удаление.

Я знаю, что если вы используете функцию set_allocated, то protobuf позаботится об удалении, если вы не вызовете release

Правильно. Если вы передаете право владения указателем куда-либо еще, ответственность за удаление ложится на владельца. Если вы не передадите право собственности (как в примере программы), то ответственность остается за вами. Если вы не удалите его, то утечка памяти.

0 голосов
/ 15 января 2019

Не используйте new с protobufs, обычно это не то, что вам нужно. Как написано, у тебя течет память.

Кроме того, ваш код не будет компилироваться так, как написано. Вот спецификация для повторяющихся полей , но вкратце, чтобы добавить элементы в такой цикл, вы должны иметь код, подобный следующему:

protobuf::address_list addrs;
for (int i = 1; i < 10; ++i)
{
    // This is a non-owning pointer. No delete necessary.
    protobuf::address *addr = addrs.add_addr();
    addr->set_street("foo");
    addr->set_name("bar");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...