#cpp
"Использование оператора delete на указателе на объект, который не был создан при помощи оператора new, создает непрогнозируемый результат." (сайт MSDN Microsoft) Есть ли способ сделать этот результат прогнозируемым (то есть простое игнорирование этой операции)? Например, чтобы: int x = 5; int* pt = &x; delete(pt); был равнозначен этому же коду без delete? Обновление Допустим, одно из полей класса Class есть массив Arr указателей на объекты класса Class2, причем часть этих объектов могут быть в динамической памяти, а часть - в статической. При написании деструктора для Class хотелось бы пройтись по массиву Arr и, если данный указатель указывает на объект Class2 в динамической памяти, освободить место от этого объекта Class2. Цикл for (int i=0;i<=Arr_index;i++) { delete(Arr[i]); } работает только в случае, если все объекты по указателям - в динамической памяти.
Ответы
Ответ 1
Выполнять delete x можно безопасно только в том случае, если для x заранее был выполнен new. Какого-то простого и переносимого способа определить только лишь по значению указателя относится он к куче или стеку не существует. Решение "в лоб" могло бы подразумевать перегрузку глобальных операторов new и delete таким образом, чтобы new обеспечивал сохранение адреса в некую таблицу, а delete проверял бы наличие этого адреса там, и если не смог найти, то просто ничего бы не делал. Но сдаётся мне, что решаете вы совсем другую задачу и в текущей интерпретации просто упёрлись в проблему XY.Ответ 2
Кажется, читал в книжке Страуструпа про программирование - "Принципы программирования", кажеится, так там у него в одном месте был хитрый вектор с указателями, которые часть надо было освобождать, а другие - нет (как тут), так он вынужден был вводить дополнительный флаг, что с этим указателем делать. Уж если сам Страуструп так поступает, то что нам остается? :)
Комментариев нет:
Отправить комментарий