Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

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

Component Pascal | Предкомпилированные заголовки | Понятие пространства имен | Стандартные конструкторы | Порядок конструирования и разрушения объектов | Множественное наследование | Проблема повторяющихся базовых классов | Замена множественного наследования наследованием от интерфейсов в других языках объектно-ориентированного программирования | Понятие константного метода | Проблемы, порождаемые наличием константных методов |


Читайте также:
  1. I.Стилистические ошибки
  2. II. Лексические ошибки
  3. АНАЛИЗ СТОИМОСТИ ОШИБКИ
  4. Аппарат в работе
  5. Атипичные проявления стенокардии
  6. В работе конференции
  7. В Самаре прошёл смотр готовности экономики Поволжья к работе по жёстким нормам ВТО

 

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

 

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 – получает адрес, на который нужно сделать переход в случае исключения. Остальные кадры выталкиваются.

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

Если объект создается на стеке и он throw-объект, то throw находит нужный кадр, очищает стек, копирует объект, делает jmp. По правилам С++ нужно вызывать размещающий оператор new и конструктор копирования.

 

В С# можно бросить исключение любого типа, а словить тип Object.

Цель расширяемого программирования с С++ достигается только при жестких ограничениях для программиста. Невозможно программировать без thirdpart-libraries.


Дата добавления: 2015-11-16; просмотров: 89 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Рекомендации по работе со ссылками| Понятие автоматического указателя (auto_ptr)

mybiblioteka.su - 2015-2024 год. (0.007 сек.)