Проблема в том, что оператор sizeof
проверяет размер своего аргумента. Аргумент, передаваемый в вашем примере кода: WCHAR*
. Итак, sizeof (WCHAR *) равен 4. Если у вас есть массив, такой как WCHAR foo[23]
, и вы взяли sizeof(foo)
, то переданный тип будет WCHAR[23]
, по сути, и даст sizeof(WCHAR) * 23
. Фактически при типе компиляции WCHAR*
и WCHAR[23]
- это разные типы, и хотя мы с вами видим, что результат new WCHAR[23]
функционально эквивалентен WCHAR[23]
, в действительности тип возвращаемого значения WCHAR*
, причем нет информации о размере.
Как примечание, поскольку sizeof(new WCHAR[23])
равно 4 на вашей платформе, вы, очевидно, имеете дело с архитектурой, в которой указатель составляет 4 байта. Если вы построите это на платформе x64, вы обнаружите, что sizeof(new WCHAR[23])
вернет 8.