Примечание. Я видел похожие вопросы, но ни один из ответов не достаточно точен, поэтому я сам прошу об этом.
Это очень нелепый вопрос "язык-юрист"; Я ищу авторитетный ответ.
В стандарте С++ говорится:
Программа может завершить время жизни любого объекта, повторно используя хранилище, которое занимает объект, или явно вызвав деструктор для объекта типа класса с нетривиальным деструктором. Для объекта типа класса с нетривиальным деструктором программа не требует прямого вызова деструктора до того, как хранилище, которое объект занимает, повторно используется или освобождается; однако, если нет явного вызова деструктора или если выражение удаления не используется для освобождения хранилища, деструктор не должен быть неявно назван , и любая программа, зависящая от побочных эффектов, создаваемых деструктором, не определена поведение.
Я просто не понимаю, что означает "зависит от побочных эффектов".
Общий вопрос:
Забывает ли вызвать деструктор, отличный от забывания вызвать обычную функцию с тем же самым телом?
Конкретный пример для иллюстрации моей точки:
Рассмотрим такую программу, как показано ниже. Также рассмотрите очевидные варианты (например, что, если я не создаю объект поверх другого, но я все равно забыл вызвать деструктор, что, если я не распечатываю вывод для его наблюдения и т.д.):
#include <math.h>
#include <stdio.h>
struct MakeRandom
{
int *p;
MakeRandom(int *p) : p(p) { *p = rand(); }
~MakeRandom() { *p ^= rand(); }
};
int main()
{
srand((unsigned) time(NULL)); // Set a random seed... not so important
// In C++11 we could use std::random_xyz instead, that not the point
int x = 0;
MakeRandom *r = new MakeRandom(&x); // Oops, forgot to call the destructor
new (r) MakeRandom(&x); // Heck, I'll make another object on top
r->~MakeRandom(); // I'll remember to destroy this one!
printf("%d", x); // ... so is this undefined behavior!?!
// If it indeed UB: now what if I didn't print anything?
}
Мне кажется смешным сказать, что это показывает "поведение undefined", потому что x
уже является случайным - и поэтому XORing это другое случайное число не может сделать программу более "undefined", чем раньше, может это?
Кроме того, в какой момент правильно сказать, что программа "зависит" от деструктора? Делает ли это так, если значение было случайным - или вообще, если мне не удавалось отличить деструктор от работы или не работает? Что, если я никогда не прочитаю эту ценность? В основном:
При каких условиях (s), если таковые имеются, показывает ли эта программа Undefined Поведение?
Точно, какое выражение (выражения) или оператор вызывает это и почему?