Распределение указателей по сравнению с обычным объявлением - PullRequest
4 голосов
/ 17 февраля 2010

иногда я вижу в различных программах на C ++ объекты, объявленные и используемые так:

object *obj = new object;
obj->action();
obj->moreAction();
//etc...

Есть ли польза от этого вместо простого:

object obj;
obj.action();
obj.moreAction();
//etc

Ответы [ 7 ]

5 голосов
/ 17 февраля 2010

Да - вы можете сохранить указатель в контейнере или вернуть его из функции, и объект не будет уничтожен, когда указатель выйдет из области видимости. Указатели используются

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

Это не бесплатно - вам нужно уничтожить объект вручную (delete), когда он вам больше не нужен, и решить, когда наступит этот момент, не всегда легко, плюс вы можете просто забыть его кодировать.

3 голосов
/ 17 февраля 2010

Первая форма, распределяющая объекты в куче, дает вам полный контроль (и полную ответственность за) время жизни объекта: вы должны явно удалить obj.

Во второй форме объект автоматически и безвозвратно уничтожается, когда obj выходит из строя (при выходе из текущего блока кода).

2 голосов
/ 17 февраля 2010

Еще одна причина, о которой никто не упомянул.
Размер стека обычно составляет 1 МБ, поэтому создание больших объектов должно выполняться в куче (с новым)

1 голос
/ 17 февраля 2010

По сути, вы должны использовать «new» только в том случае, если вы хотите, чтобы объект жил дольше срока действия области, в которой вы его создали. Например:

X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()

Если вы хотите, чтобы объект жил только в области видимости, не используйте «new», а просто определите переменную:

{
    ClassName x;
    // use x
}
0 голосов
/ 15 марта 2013

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

0 голосов
/ 17 февраля 2010

Да, на то есть веская причина: у вас гораздо больше шансов получить правильную программу при использовании последней формы.

Проблема в том, что первая форма (указатель) представляет собой C ism,C++ * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * *]] * * * * * * 5 * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * *1006* * * * * * * * * * * *1006* * * * * * * * * * *, * *1006* *, * * * * *, * * * * *, * * * * *, * * * * * B *, и *.1010 * теперь вы управляете жизненным циклом вашего объекта явно (но не можете его забыть)

вы можете хранить свой объект в контейнере с полиморфизмом вы не забиваете стек и, таким образом, имеетеменьший риск столкновения с переполнением стека
0 голосов
/ 17 февраля 2010

Все сводится к большему контролю жизненного цикла рассматриваемого объекта (при использовании new).

...