Игнорирование delete для указателя на объект в статической памяти

327
04 мая 2017, 15:28

"Использование оператора 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]);
}

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

Answer 1

Выполнять delete x можно безопасно только в том случае, если для x заранее был выполнен new. Какого-то простого и переносимого способа определить только лишь по значению указателя относится он к куче или стеку не существует.

Решение "в лоб" могло бы подразумевать перегрузку глобальных операторов new и delete таким образом, чтобы new обеспечивал сохранение адреса в некую таблицу, а delete проверял бы наличие этого адреса там, и если не смог найти, то просто ничего бы не делал.

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

Answer 2

Кажется, читал в книжке Страуструпа про программирование - "Принципы программирования", кажеится, так там у него в одном месте был хитрый вектор с указателями, которые часть надо было освобождать, а другие - нет (как тут), так он вынужден был вводить дополнительный флаг, что с этим указателем делать.

Уж если сам Страуструп так поступает, то что нам остается? :)

READ ALSO
OpenGl и ввод значений

OpenGl и ввод значений

Здравствуйте, помогите пожалуйста

407
Класс для pаботы с комплексными числами. [требует правки]

Класс для pаботы с комплексными числами. [требует правки]

Подскажите, как создать наследников класса: 1класс, хранящий число так же в виде строки и имеющий методы перевода строки в число и назад; 2

272
JavaScript: привязка контекста [дубликат]

JavaScript: привязка контекста [дубликат]

На данный вопрос уже ответили:

292
AJAX: пустой $_FILES

AJAX: пустой $_FILES

Здравствуйте! Отправляю файл на сервер (локальный: vertrigo(apache)) с помощью AJAX и drag & drop HTML5Файл записывается в папку, на страницу с AJAX возвращается...

381