【发布时间】:2016-03-14 19:06:58
【问题描述】:
我在使用原始指针和 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;
}
Variant 1 和 Variant 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变量会随着它超出范围而消失。
标签: c++ c++11 unique-ptr