Висячие ссылки.Альтернативы для висящих указателей и ссылок? - PullRequest
9 голосов
/ 24 ноября 2010

Следующий код создает висячие ссылки:

int main()
{
  int *myArray = new int[2]{ 100, 200 };
  int &ref = myArray[0];
  delete[] myArray;
  cout << ref;  // Use of dangling reference.
}

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

Какова лучшая стратегия против висячих ссылок и висячих указателей?

Ответы [ 5 ]

13 голосов
/ 24 ноября 2010

Не удаляйте память, пока вы не закончили с ней.

Звучит глупо, но это ваша единственная защита - правильно понимайте, кому принадлежит память за каждой переменной и когда ее можно безопасно освободить.

Умные указатели могут помочь, но вышеприведенное все еще применимо.

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

7 голосов
/ 24 ноября 2010

Держите их в нужной области:

int main(){
  int *myArray;
  myArray = new int[2]{ 100, 200 };
  {
    int& ref = myArray[0];
    // use the ref here
    cout<<ref;  \\no longer a dangling reference
  } // ref falls out of scope here
  delete[] myArray;
 }
5 голосов
/ 24 ноября 2010

Пациент: Доктор, мне больно, когда я делаю это ...

Доктор: Тогда прекратите это делать ...

Не освобождайте память во времяссылка на него.


РЕДАКТИРОВАТЬ

Единственный способ поймать это отладка, хорошие юнит-тесты и запуск под Valgrind, или запустить вашу программу под Valgrind.

4 голосов
/ 09 октября 2015

Все ответы здесь были «будьте осторожны!» И «используйте хорошие методы программирования!».
Это не очень удовлетворительный ответ.Эти проблемы существуют в C более 40 лет, и они все еще распространены в любом проекте C ++ значительного размера.

Самые важные рекомендации, которые вы услышите, рекомендуют люди:

  • Используйте умные указатели
  • Используйте RAII

Оба верны,но вы можете сделать больше.

В 2015 году Standard C ++ Foundation выпустила библиотеку поддержки Guidelines .

Вы можете писать программы на C ++, которые являются статическиТип безопасен и не имеет утечек ресурсов.Вы можете сделать это без потери производительности и без ограничения выразительной силы C ++.Эта модель для безопасного для типов и ресурсов C ++ была реализована с использованием комбинации стандартных средств языка C ++ стандарта ISO, статического анализа и крошечной библиотеки поддержки (написанной на стандарте ISO C ++).

Я рекомендуювы используете GSL Owner<> с инструментом статического анализа.
Это гарантирует безопасное поведение.

3 голосов
/ 24 ноября 2010

Хорошие практики программирования.Компилятор дает вам более чем достаточно веревки, чтобы повеситься;это ваша ответственность, чтобы убедиться, что вы этого не сделаете.

Другими словами, если вы не берете ссылки на массив, а затем удаляете его, у вас не возникнет проблем.

«Но что, если это все равно произойдет?»

Нет простого ответа, правда.Все дело в обучении и умении использовать инструменты, которые вы пытаетесь использовать.

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