Если ваши пользователи используют delete[]
на указателях, которые они не получили от new[]
, ударьте их по голове ударной битой.
Существует множество причин, по которым указатель может быть разыменован, но его нельзя передавать для удаления:
- Кто-то еще удалит его.
- Это не начало блока.
- Он был получен от
malloc
или другого не new
распределителя.
- Имеет статическое, а не динамическое время жизни.
- Если имеет автоматическое время жизни.
Некоторые из них будут проявляться в исключениях во время выполнения. Другие вызовут сбои в более позднее время. Все это «неопределенное поведение» согласно стандарту.
Предполагается, что указатель не может использоваться в качестве аргумента delete
, если явно не указано иное.
Если программисты начального уровня делают эту ошибку, обучите их. Если «опытные» разработчики делают это, увольняйте их за то, что они лежали в их резюме.
Если вы просто хотите, чтобы это причиняло боль, когда они это делают, выделите массив на один больше, чем необходимо, и return Array + 1;
. Теперь все взорвется, если они попытаются использовать delete[]
.
Практическое использование состоит в том, что (с большей вероятностью) это приведет к аварийному завершению программы внутри поддельного вызова для удаления, при этом функция-нарушитель все еще будет находиться в стеке вызовов. Где оригинал, вероятно, продолжит работать некоторое время, и, наконец, вылетает в невинном коде. Так что это поможет вам поймать глупых пользователей.