АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Типичные ошибки при работе со ссылками

Читайте также:
  1. I. Типичные договоры, основные обязанности и их классификация
  2. IX. Отношение к работе (учебе).
  3. Алгоритм обратного распространения ошибки
  4. Анализ деятельности по работе с молодежью городского исполнительного комитета г. Набережные Челны
  5. Аннотация к работе (не менее 4-х предложений)
  6. АТИПИЧНЫЕ ФОРМЫ ИМ
  7. АТИПИЧНЫЕ ФОРМЫ МАСТОИДИТА
  8. АУТОТРЕНИНГ В РАБОТЕ ПЕДАГОГА
  9. Бригады к работе по наряду и распоряжению
  10. В СОЦИАЛЬНОЙ РАБОТЕ»
  11. Возвратившиеся члены бригады могут приступить к работе только с разрешения производителя работ (наблюдающего).
  12. Вопрос 4. Мотивация к работе

 

При работе со ссылками существует типовая ошибка — возврат через ссылку переменной, созданной на стеке. Пример ошибочной записи:

 

void f(int *p)

{

int i;

p = &i;

}

 

Следующая запись тоже будет ошибочной:

 

void f(int &r)

{

int i;

r = i;

}

 

Следующий пример тоже ошибочен, так как нельзя возвращать адрес объекта, созданного на стеке:

 

std::string& GetName(Object* Obj)

{

const char* str = Obj->GetName();

return std::string(str);

}

 

 

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

 

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

 

Второй метод заключается в использовании операции new для создания новой области хранения. Но необходимо не забыть после вызвать delete:

 

delete &ref

 

18. Обработка исключительных ситуаций в языке C++. Защита от утечки ресурсов. Имитация оператора try-finally. Понятие автоматического указателя (auto_ptr). Использование автоматических указателей для защиты от утечки ресурсов.

 

Обработка исключительных ситуаций в языке C++

В С++ отсутствует аналог блока try…finally…end. На платформе Windows благодаря структурной обработке ОС существуют следующий блок:

 

__try

{

...

}

__finally

{

...

}

 

Но следует отметить, что для переносимых программ он не подходит. В С++ существует аналог блока try…except…end:

 

Try

{

...

}

Catch(std::ios_base::failure)

{

...

}

Catch(std::exception)

{

...

}

Catch(...)

{

...

}

 

Распознавание исключительных ситуаций происходит последовательно блоками catch, поэтому их последовательность должна быть от частного к общему. Последний блок catch в примере выше ловит любую исключительную ситуацию. Создание исключительных ситуаций выполняется с помощью оператора throw:

 

throw std::exception("Ошибка");

 

Внутри блока catch оператор throw возобновляет исключительную ситуацию, как и raise в Delphi. При создании исключительной ситуации при помощи оператора throw объект, описывающий исключительную ситуацию, может быть создан в динамической памяти:

 

throw new std::exception("Ошибка");

 

Если применяется такой способ создания исключительной ситуации, ее уничтожение должно происходить следующим образом:

 

try

{

...

throw new std::exception("Ошибка"); // по ссылке – throw std::exception(“Mistake”);

}

catch(std::exception & e)

{

}

catch(std::exception *e)

{

delete e;

}

catch(...)

{

...

}

При try на стек укладывается дополнительная информация. Throw идет по кадрам в ближайший кадр try – получает адрес, на который нужно сделать переход в случае исключения. Остальные кадры выталкиваются.


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)