Общие указатели на векторы

0

Извините простой вопрос, но у меня возникли проблемы с пониманием указателей на коллекции.

Представьте, что у меня есть этот вектор байтов:

vector<uint8_t> n;

Я хочу сохранить это в общем указателе. Зачем нужен адрес (&) оператора?

shared_ptr<vector<uint8_t>> m(&n);

Я бы подумал, что конструктор примет n. Но я также думаю, что у меня есть глубокое заблуждение о том, что здесь происходит :)

  • 1
    Аргументом для конструктора должен быть указатель.
  • 2
    Я не хочу быть этим парнем, но ... я думаю, ты имел в виду недопонимание. Если вы действительно напуганы: p (я удалю этот комментарий очень скоро)
Показать ещё 1 комментарий
Теги:
pointers
collections
shared-ptr

1 ответ

4
Лучший ответ

Я хочу сохранить это в общем указателе.

Нет, нет. Общий указатель предназначен для управления динамическим объектом, который необходимо удалить; этот вектор не был создан с new, поэтому не может управляться (нормальным) общим указателем. Указатель попытается удалить его, вызывая хаос.

Вы хотите создать вектор динамически, чтобы shared_ptr мог правильно управлять:

auto m = make_shared<vector<uint8_t>>();    

Зачем нужен адрес (&) оператора?

Поскольку общие указатели (обычно) используются для управления объектами, созданными с помощью new, а new дает указатель; поэтому shared_ptr имеет конструктор, принимающий аргумент указателя. Однако обычно лучше использовать функцию make_shared продемонстрированную выше, вместо того, чтобы возиться с new самостоятельно.

  • 0
    "обычно"? Есть ли законное использование для shared_ptr с объектами, не выделенными с new ?
  • 3
    @Nick: Да, если вы предоставите средство удаления, которое делает что-то кроме delete .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню