Извините простой вопрос, но у меня возникли проблемы с пониманием указателей на коллекции.
Представьте, что у меня есть этот вектор байтов:
vector<uint8_t> n;
Я хочу сохранить это в общем указателе. Зачем нужен адрес (&) оператора?
shared_ptr<vector<uint8_t>> m(&n);
Я бы подумал, что конструктор примет n
. Но я также думаю, что у меня есть глубокое заблуждение о том, что здесь происходит :)
Я хочу сохранить это в общем указателе.
Нет, нет. Общий указатель предназначен для управления динамическим объектом, который необходимо удалить; этот вектор не был создан с new
, поэтому не может управляться (нормальным) общим указателем. Указатель попытается удалить его, вызывая хаос.
Вы хотите создать вектор динамически, чтобы shared_ptr
мог правильно управлять:
auto m = make_shared<vector<uint8_t>>();
Зачем нужен адрес (&) оператора?
Поскольку общие указатели (обычно) используются для управления объектами, созданными с помощью new
, а new
дает указатель; поэтому shared_ptr
имеет конструктор, принимающий аргумент указателя. Однако обычно лучше использовать функцию make_shared
продемонстрированную выше, вместо того, чтобы возиться с new
самостоятельно.
shared_ptr
с объектами, не выделенными с new
?
delete
.