unique_ptr & lt; TStringList [] & gt; Сбой dsts (новый TStringList [5])

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<>?

3

Решение

Это не 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 с массивом?)

3

Другие решения


По вопросам рекламы [email protected]