Как определить, можно ли безопасно удалить параметр функции

Способ сохранения значения, необходимого вам в прокси-переменной, и получить эту переменную.

I.E.

while( variable < 5 )
{
    int copy = variable;
    actions.Add( () => copy * 2 );
    ++variable;
}
0
задан Alex Gh 16 January 2019 в 20:14
поделиться

2 ответа

На самом деле вы можете сделать это в C ++ 98. Нет необходимости в новом стандарте. Вы не размещаете delete внутри f. Вместо этого просто создайте объект, который вы передаете в f с помощью auto_ptr guard:

Test *obj = new Test();

f(auto_ptr<Test>(new Test()).get());
f(obj);

Автоматический указатель обеспечит освобождение объекта после завершения выполнения функции.

Ну, если честно, это * почти то же самое. Если вам явно нужно удалить указатель внутри f, а не просто охранять его, чтобы убедиться, что он освобожден, тогда вам действительно нужен умный указатель, а не просто auto_ptr, для этого вам нужно либо использовать boost или c ++ 11, либо просто написать себя, это действительно не сложно реализовать.

Также обратите внимание, что auto_ptr устарела в новом стандарте, так что этот код не совместим напрямую.

0
ответ дан Yuri Nudelman 16 January 2019 в 20:14
поделиться

Если вы можете перейти на C ++ 11, вы должны использовать std::shared_ptr , и ваша проблема решена. shared_ptr позаботится о количестве пользователей указателя и автоматически очистит его, когда последний пользователь удалит его. И я настоятельно рекомендую перейти на современный C ++, это решает большое количество проблем.

Вы также можете взглянуть на Boost SmartPtr - он делает то же самое и может использоваться до C ++ 11.

Вы также можете попробовать реализовать такую ​​утилиту по своему усмотрению, но вы должны убедиться, что реализовали ее должным образом - с счетчиком ссылок, увеличивающимся и уменьшающимся правильно в духе Правило трех

< hr>

Если вам нужно использовать необработанные указатели, то в стандартном C ++ нет способа гарантировать, что указатель будет (или не будет) освобожден функцией.
Единственный способ сообщить другим программистам, что ваша функция хочет стать владельцем указателя (и удалит его), - это через документацию , либо в коде (с комментариями), либо с помощью отдельного документа (если вы создать API например).

Тем не менее, вы должны тщательно продумать, должна ли функция вступать во владение указателем. Разумно ли для функции владеть ею? Если нет, просто оставьте его и позвольте распределительной функции позаботиться об освобождении.

0
ответ дан Yksisarvinen 16 January 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: