Как работает оператор [] в std::shared_ptr

93
24 июня 2021, 02:00

Пытаюсь получить доступ к элементу массива через его указатель, объявленный как shared_ptr так:

#include <iostream>
#include <memory>
using namespace std;
int main() 
{
    {
        shared_ptr<int> up(new int[5] {1,2,3,4,5});
        cout << up[3];
    }
    getchar();
    return 0;
}

Однако во время компиляции выдаётся ошибка о том, что "отсутствует оператор [], соответствующий этим операндам".

Я прочитал на cppreference и в подсказка среды разработки, что оператор [] у shared_ptr принимает тип ptrdiff_t, однако так:

#include <iostream>
#include <memory>
using namespace std;
int main() 
{
    {
        shared_ptr<int> up(new int[5] {1,2,3,4,5});
        cout << up[static_cast<ptrdiff_t>(3)];
    }
    getchar();
    return 0;
}

тоже не работает с той же ошибкой.

Вопрос: как всё-таки правильно пользоваться этим оператором и что я делаю не так?

Answer 1

Первая Ваша ошибка - попытка инициализировать std::shared_ptr<int> массивом, выделенным через new int[]. Это некорректно, так как shared_ptr<T> вызывает delete при освобождении памяти, а не требуемый delete[].

Замена int на int[] решает эту проблему и Вашу - умный указатель понимает, что на самом деле содержит в себе массив и позволяет его индексировать.

READ ALSO
noexcept swap с мьютексами

noexcept swap с мьютексами

Считается хорошим тоном обеспечивать noexcept-swap функцию-член классаЧто делать, если появляется необходимость добавить в этой функции такую...

128
Проверка блокировки MAC OS

Проверка блокировки MAC OS

Как проверить заблокирована ли машина на MAC OS?

96
Как создать программно папку на системном диске в Qt?

Как создать программно папку на системном диске в Qt?

У меня есть часть кода, в которой должна создаваться папка на диске С:

199
jQuery - $(&hellip;).scrollTo is not a function

jQuery - $(…).scrollTo is not a function

Есть такой код:

112