Способ сохранения значения, необходимого вам в прокси-переменной, и получить эту переменную.
I.E.
while( variable < 5 )
{
int copy = variable;
actions.Add( () => copy * 2 );
++variable;
}
На самом деле вы можете сделать это в 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 устарела в новом стандарте, так что этот код не совместим напрямую.
Если вы можете перейти на C ++ 11, вы должны использовать std::shared_ptr
, и ваша проблема решена. shared_ptr
позаботится о количестве пользователей указателя и автоматически очистит его, когда последний пользователь удалит его. И я настоятельно рекомендую перейти на современный C ++, это решает большое количество проблем.
Вы также можете взглянуть на Boost SmartPtr - он делает то же самое и может использоваться до C ++ 11.
Вы также можете попробовать реализовать такую утилиту по своему усмотрению, но вы должны убедиться, что реализовали ее должным образом - с счетчиком ссылок, увеличивающимся и уменьшающимся правильно в духе Правило трех
< hr> Если вам нужно использовать необработанные указатели, то в стандартном C ++ нет способа гарантировать, что указатель будет (или не будет) освобожден функцией.
Единственный способ сообщить другим программистам, что ваша функция хочет стать владельцем указателя (и удалит его), - это через документацию , либо в коде (с комментариями), либо с помощью отдельного документа (если вы создать API например).
Тем не менее, вы должны тщательно продумать, должна ли функция вступать во владение указателем. Разумно ли для функции владеть ею? Если нет, просто оставьте его и позвольте распределительной функции позаботиться об освобождении.