Я столкнулся с каким-то странным поведением при работе с необработанными указателями и std :: unique_ptr.get(). дал этот пример:Нечетное поведение возврата std :: unique_ptr :: get()
#include <iostream>
class Car{
public:
Car(){std::cout << "car gets created\n"; }
~Car(){std::cout << "car gets destroyed\n"; }
};
void func(Car* carPtr){
std::unique_ptr<Car> car = std::make_unique<Car>();
carPtr = car.get();
}
int main(){
Car* carPtr{nullptr};
std::cout << "first check: \n";
if(carPtr){
std::cout << "car Pointer is NOT assigned to nullptr!\n";
}
else{
std::cout << "car Pointer is assigned to nullptr\n";
}
//Variant 1:
//func(carPtr);
//Variant 2:
//std::unique_ptr<Car>car = std::make_unique<Car>();
//carPtr = car.get();
//car.reset();
std::cout << "\nsecond check: \n";
if(carPtr){
std::cout << "car Pointer is NOT assigned to nullptr!\n";
}
else{
std::cout << "car Pointer is assigned to nullptr\n";
}
return 0;
}
Вариант 1 и Вариант 2 делает в основном ту же вещь: unique_ptr возвращает адрес объекта к указателю, а затем объект будет удален. Однако выход во второй проверке по какой-то причине я не понимаю.
Выход в вариант 1:
first check:
car Pointer is assigned to nullptr
car gets created
car gets destroyed
second check:
car Pointer is assigned to nullptr
Выход в варианте 2 является:
first check:
car Pointer is assigned to nullptr
car gets created
car gets destroyed
second check:
car Pointer is NOT assigned to nullptr!
Я не увидеть разницу. В обоих вариантах я в основном делаю то же самое. Что я упустил?
В чем смысл 'func'? Он не принимает свой параметр по ссылке, поэтому присвоение 'carPtr = ...' в принципе бессмысленно, потому что локальная переменная 'carPtr' уходит, поскольку она выходит за пределы области видимости. – kfsone