Не существует "магического" способа определить, относится ли int*
к:
- единственное целое, выделенное для кучи
- выделенный массив кучи
- целое число в массиве, выделенном для кучи
Информация была потеряна системой типов, и никакой метод времени выполнения (переносимый) не может ее исправить. Это бесит и серьезный недостаток дизайна (*) в C, который унаследован от C ++ (некоторые говорят, ради совместимости).
Тем не менее, есть некоторые способы работы с массивами в умных указателях.
Во-первых, ваш unique_ptr
тип неверен для работы с массивом, вы должны использовать:
std::unique_ptr<int[]> p(new int[10]);
что означает означает для вызова delete[]
. Я знаю, что речь идет о реализации специального предупреждения в Clang для выявления очевидных несоответствий с unique_ptr
: это проблема качества реализации (стандарт просто говорит, что это UB), и не все случаи могут быть рассмотрены без WPA.
Во-вторых, boost::shared_ptr
может иметь пользовательское средство удаления, которое может , если вы настроите его для вызова правильного оператора delete[]
. Тем не менее, есть boost::shared_array
, специально предназначенный для этого. Еще раз, обнаружение несоответствий является проблемой качества реализации. std::shared_ptr
страдает той же проблемой ( отредактировано после замечания ildjarn ).
Я согласен, что это не красиво. Это кажется настолько неприятным, что недостаток дизайна (*) от происхождения Си до сих пор преследует нас.
(*) некоторые скажут, что C сильно склоняется к тому, чтобы избежать накладных расходов, и это добавило бы накладные расходы. Я частично не согласен: malloc
всегда знаю размер блока, в конце концов.