Вопрос по warning:

Раньше (в IDE 1.x) этого не было. Сейчас добавили.

Вообще, это для устранения неопределённости и, главное, для устранения проблем при создании экземпляров объекта.

По поводу неопределённости: стандарт С++ говорит, что эти библиотеки наследуются от Си, а в стандарте Си сказано:

"If the size of the space requested is zero, the behavior is implementation-defned: either a null pointer is returned to indicate an error, or the behavior is as if the size were some nonzero value, except that the returned pointer shall not be used to access an object. (ISO/IEC 9899:2018, §7.22.3)

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

Тогда, если выполнять требования стандарта (выше) невозможно создать экземпляр объекта, у которого есть только методы (не виртуальные), но нет свойств. Его длина получается нулевой, значит либо надо выдавать ошибку при попытке создания, либо возвращать указатель, который не может использоваться как this, т.к. он “shall not be used to access an object”.

И как быть? Выкручиваются по-разному. Одно из решений вот такое – всегда запрашивать хотя бы один байт. Тогда this на него укажет и проблемы нет.

P.S. Кстати, тут есть простор для “настоящих мужчин”. В классе можно определить свой new и свой sizeof. При этом никто не контролирует, что new запрашивает именно столько памяти, сколько возвращает sizeof (программист определил – ему виднее как надо). Поэтому запрашивать создание массивов таких объектов – истинное, ничем не замутнённое удовольствие :slight_smile:

1 лайк