Предположим, у меня есть следующий код в C++:Использует ли это использование std :: make_unique для не-уникальных указателей?
#include <memory>
#include <iostream>
struct Some {
Some(int _a) : a(_a) {}
int a;
};
int main() {
Some some(5);
std::unique_ptr<Some> p1 = std::make_unique<Some>(some);
std::unique_ptr<Some> p2 = std::make_unique<Some>(some);
std::cout << p1->a << " " << p2->a << std::endl;
return 0;
}
Как я понимаю, уникальные указатели используются, чтобы гарантировать, что ресурсы не являются общими. Но в этом случае как p1
, так и p2
указывают на тот же пример some
.
Пожалуйста, представьте ситуацию.
Ваша ситуация была бы легко диагностирована, если бы вы сами напечатали значения указателя, а не поле 'a'. Или вы сделали «громкий» конструктор копий. Кроме того, вашей основной ошибкой было, вероятно, думать, что make_unique создает указатель на данный объект (здесь локальная переменная 'some'); это не то, что он делает, или для. –
Я совершенно удивлен, что в этом бедном посте так много оборотов. Что случилось с SO? – Walter