Является ли практика возврата ссылочной переменной C ++ злой? - PullRequest
314 голосов
/ 15 апреля 2009

Это немного субъективно, я думаю; Я не уверен, что мнение будет единодушным (я видел много фрагментов кода, в которых возвращаются ссылки).

Согласно комментарию к этот вопрос, который я только что задал, относительно инициализации ссылок , возвращает ссылку, может быть злом, потому что, [насколько я понимаю], легче упустить ее удаление, что может привести к утечки памяти.

Это меня беспокоит, так как я следовал примерам (если я не представляю себе что-то) и делал это в нескольких местах ... Я неправильно понял? Это зло? Если да, то насколько злой?

Я чувствую, что из-за моего смешанного мешка с указателями и ссылками в сочетании с тем, что я новичок в C ++, и полной путаницы в отношении того, что использовать, когда мои приложения должны быть адом утечки памяти ...

Кроме того, я понимаю, что использование интеллектуальных / общих указателей обычно считается наилучшим способом избежать утечек памяти.

Ответы [ 16 ]

0 голосов
/ 14 марта 2017
    Class Set {
    int *ptr;
    int size;

    public: 
    Set(){
     size =0;
         }

     Set(int size) {
      this->size = size;
      ptr = new int [size];
     }

    int& getPtr(int i) {
     return ptr[i];  // bad practice 
     }
  };

Функция getPtr может получить доступ к динамической памяти после удаления или даже к нулевому объекту. Что может привести к недопустимым исключениям доступа. Вместо этого должны быть реализованы метод получения и установки и проверка размера перед возвратом.

0 голосов
/ 05 октября 2015

Лучше всего создать объект и передать его в качестве параметра ссылки / указателя в функцию, которая выделяет эту переменную.

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

0 голосов
/ 29 июля 2014

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

0 голосов
/ 23 июля 2013

О ужасном коде:

int& getTheValue()
{
   return *new int;
}

Таким образом, указатель памяти теряется после возврата. Но если вы используете shared_ptr вот так:

int& getTheValue()
{
   std::shared_ptr<int> p(new int);
   return *p->get();
}

Память не теряется после возврата и будет освобождена после назначения.

0 голосов
/ 16 апреля 2009

Я столкнулся с реальной проблемой, где это было действительно зло. По сути, разработчик вернул ссылку на объект в векторе. Это было плохо !!!

Полная информация, о которой я писал в Janurary: http://developer -resource.blogspot.com / 2009/01 / pros-and-cons-of-returing-reference.html

0 голосов
/ 15 апреля 2009

Функция как lvalue (или возвращение неконстантных ссылок) должна быть удалена из C ++. Это ужасно не интуитивно понятно. Скотт Мейерс хотел min () с таким поведением.

min(a,b) = 0;  // What???

, который на самом деле не является улучшением

setmin (a, b, 0);

Последнее даже имеет больше смысла.

Я понимаю, что функция как lvalue важна для потоков стиля C ++, но стоит отметить, что потоки стиля C ++ ужасны. Я не единственный, кто так думает ... насколько я помню, у Александреску была большая статья о том, как сделать лучше, и я считаю, что boost также попытался создать лучший тип безопасного ввода-вывода.

...