MyEnvironment:
C++ Builder XE4
Я пытаюсь использовать массив TStringList
с помощью unique_ptr<>
,
Следующее не дало никакой ошибки:
unique_ptr<int []> vals(new int [10]);
С другой стороны, следующее показывает ошибку:
unique_ptr<TStringList []> sls(new TStringList [10]);
Ошибка «нарушение доступа по адресу 0x000000000: чтение адреса 0x0000000».
За TStringList
я не могу использовать массив unique_ptr<>
?
Это не unique_ptr
проблема: ваша попытка не удалась, потому что вы пытаетесь создать массив фактических TStringList
экземпляры объекта вместо массива указателей на TStringList
экземпляры (для более подробной информации вы можете посмотреть на Как создать массив кнопок на Borland C ++ Builder и работать с ним? а также Центральный отчет качества № 78902).
Например. Вы получите нарушение доступа, даже если попытаетесь:
TStringList *sls(new TStringList[10]);
(указатель на динамический массив размера 10
и введите TStringList
).
Вы должны управлять указателем на динамический массив типа TStringList *
, С помощью std::unique_ptr
:
std::unique_ptr< std::unique_ptr<TStringList> [] > sls(
new std::unique_ptr<TStringList>[10]);
sls[0].reset(new TStringList);
sls[1].reset(new TStringList);
sls[0]->Add("Test 00");
sls[0]->Add("Test 01");
sls[1]->Add("Test 10");
sls[1]->Add("Test 11");
ShowMessage(sls[0]->Text);
ShowMessage(sls[1]->Text);
В любом случае, если размер известен во время компиляции, это лучший выбор:
boost::array<std::unique_ptr<TStringList>, 10> sls;
(также посмотрите на Есть ли какое-либо использование для unique_ptr с массивом?)