shared_ptr для динамического массива

319
10 октября 2017, 04:54
class My {
public:
    auto create(size_t size)->void;
    auto empty()->bool;
    auto print()->void;

    size_t size;
    shared_ptr<int> arr;
};
auto My::create(size_t size)->void {
    this->arr = make_shared<int>(new int[size]);
    this->size = size;
};

Имеется небольшой класс для создания массива обернутого в shared_ptr, при запуске возникает ошибка : "Невозможно преобразовать int* в int", не могу понять почему

Answer 1

Дело в том, что make_shared создаёт указатель на один объект, а параметры передаёт в конструктор. Т. е.

auto a = make_shared <int> (42);

это по сути представляет собой (хотя и немного эффективнее)

auto a = shared_ptr <int> (new int (42));

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

Answer 2

make_shared будет (скорее всего) поддерживать создание shared_ptr, в котором хранится указатель на массив, со следующей версии C++. shared_ptr поддерживает такое создание уже сегодня, но для этого нужно иметь последний компилятор, поддерживающий этот функционал (студия на момент написания ответа этого не умеет).

this->arr = std::shared_ptr<int[]>(new int[size]);
Answer 3

Объединю решения вопроса для удобства:
1) ассоциация
2) используя reset

 this->arr.reset(new int[size], std::default_delete<int[]>());
READ ALSO
Изменение текстового поля на форме из потока QML QT C++

Изменение текстового поля на форме из потока QML QT C++

Пытаюсь изменить значение текстового поля из другого потока, но почему-то не работает( Имеется класс MyThread:

277
проект на mpi Test.exe вызвал срабатывание точки останова

проект на mpi Test.exe вызвал срабатывание точки останова

Простой код с использованием MPIПри сборке в релиз отладка останавливается в указанном месте на ветке else

331
C++ функция Split. Оптимизация

C++ функция Split. Оптимизация

Написал вот такие две функции для нахождения длины строки и разбиение ее на лексемыКак можно еще оптимизировать данный код, не используя...

386
Как скомпилировать программку в notepad++

Как скомпилировать программку в notepad++

Я знаю, как компилировать программку в Sublime Text 3Надо просто нажать клавишу F7

270