c ++, объект, созданный в куче, против локального - при возврате указателя - PullRequest
2 голосов
/ 10 декабря 2011

Это дополнительный вопрос от Безопасно в C #, а не в C ++, простой возврат указателя / ссылки,

Это:

person* NewPerson(void)
{
  person p;
  /* ... */
  return &p; //return pointer to person.
}

так же, как?

person* NewPerson(void)
{
  person* pp = new person;

  return pp; //return pointer to person.
}

Я знаю, что первая - плохая идея, потому что это будет дикий указатель. Во втором случае, будет ли объект безопасным в куче - и как в c # выйти из области видимости, когда последняя ссылка исчезнет?

Ответы [ 5 ]

3 голосов
/ 10 декабря 2011

Да, второй случай безопасен.

Но вызывающей стороне потребуется delete возвращенный указатель. Вы можете изменить это на использование boost::shared_ptr, и оно будет уничтожено, когда оно больше не используется:

boost::shared_ptr<person> NewPerson()
{
    boost::shared_ptr<person> pp = boost::make_shared<person>();

    return pp;
}

Если C ++ 11, то вы можете использовать std::shared_ptr или std::unique_ptr.

2 голосов
/ 10 декабря 2011

Это безопасно, объект будет еще жив после возврата.

Но не ожидайте, что объект будет автоматически очищен для вас в C ++.Стандарт C ++ не имеет сборки мусора.Вам нужно будет delete объект самостоятельно или использовать какую-либо форму умного указателя.

1 голос
/ 10 декабря 2011
person* NewPerson(void)
{
  person* pp = new person;

  return pp; //return pointer to person.
}

Я знаю, что первая - плохая идея, потому что это будет дикий указатель.Во втором случае, будет ли объект безопасным в куче - и, как в c #, выйдет из области видимости, когда последняя ссылка на него исчезнет?

Исправьте в первом: он будет возвращатьсяуказатель на данные в стеке этой функции, которые будут восстановлены и изменены после завершения функции.

Во втором случае: объект создается в куче, которая отделена от стека выполнения.Когда функция завершается, объект в куче безопасен и остается тем же.Однако C ++ автоматически не выполняет сборку мусора, поэтому, если вы потеряете все ссылки на объект кучи, это приведет к утечке памяти - пространство объекта не будет освобождено до завершения программы.

0 голосов
/ 10 декабря 2011

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

0 голосов
/ 10 декабря 2011

Последнее безопасно. Однако C ++ (обычно) не обеспечивает сборку мусора, и поэтому вам необходимо организовать явный delete возвращаемого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...