У меня есть приложение с множеством новых, которые на самом деле не кажутся необходимыми, экземпляры объектов удаляются через несколько строк после использования в том же контексте (функция).
Можно ли предположить, что я могу изменить эти new
составить распределение или есть особые соображения, которые я должен принять?
Эти объекты относительно легкие, без больших буферов или чего-то подобного.
РЕДАКТИРОВАТЬ :
Еще один момент, который я обнаружил, заключается в том, что порядок удаления объектов сложнее контролировать. Вы должны быть более осторожными, как вещи созданы.
Если вы не создаете объекты разных типов в зависимости от условий выполнения, у вас не должно быть проблем. Я имею в виду, если у вас есть что-то вроде:
A* pA;
if (condition)
pA = new B();
else
pA = new C();
Тогда вы должны придерживаться указателей; в противном случае вы бы занялись нарезкой объектов и пропустили виртуальные вызовы. Но если ваш код прост:
A* pA = new A();
// ...
delete pA;
Тогда вам будет лучше использовать стек. Вы избежите проблем, если между созданием и удалением объекта возникнет исключение, чтобы назвать одно из наиболее очевидных преимуществ.
[РЕДАКТИРОВАТЬ: Другая возможность переопределенаoperator new
, как говорит Марк Б в своем ответе. Основное использование для переопределения operator new
оптимизирует выделение памяти для определенных классов; в вашем случае это, вероятно, не повлияет на вас. Но да, есть вероятность, что ваши классы имеют переопределение operator new
это делает странные вещи, и в этом случае вы бы изменили поведение программы.]
Хорошее правило: не используйте указатели, если это не нужно. Единственный, кто может решить, действительно ли вы должны или нет, это, конечно, вы.
Есть несколько соображений, которые я могу придумать.
Если указатель используется полиморфно (ваш вопрос подразумевает нет), то вы должны продолжать использовать указатели. В этом случае измените его на использование соответствующего умного указателя.
Если любой из ваших классов переопределить operator new
внутренне вы можете полностью изменить поведение вашей программы, больше не вызывая эти методы.
В противном случае, поскольку объекты легковесны, переход к объектам на основе стека выглядит намного чище.
Это зависит от вашего конкретного контекста; не видя реального кода, трудно дать конкретный совет.
Тем не менее, вы могли бы по крайней мере рассмотреть возможность использования умные указатели вместо сырье указатели назначены звонки new
(и, следовательно, обращая внимание, чтобы правильно позвонить delete
).
Если ваши объекты живут только в пределах функции, вы можете рассмотреть boost::scoped_ptr
или C ++ 11 std::unique_ptr
,
например
#include <memory>
void f()
{
std::unique_ptr<SomeClass> p( new SomeClass );
p->DoSomething();
....
// No need to call delete.
// This helps making code exception-safe, and it's useful if you return from the function
// from different points (so you don't have to make different delete calls to properly
// release resources).
}
В общем, в современном C ++ коде владеющим сырые указатели следует использовать редко и в редких местах, например внутри границ классов для классов, которые являются прямыми менеджерами ресурсов (и даже в этих случаях часто можно использовать std::unique_ptr
) или когда вы реализуете свои собственные специальные структуры данных и т. д.