裸指针在使用的时候,需要手动new和delete,有时候忘记delete就会造成内存泄漏。
所以出现了智能指针,可以帮助我们去管理内存的删除操作。本文只讲unique_ptr的使用。
unique_ptr对象包装一个原始指针,并负责其生命周期。当该unique_ptr对象被销毁时,会在其析构函数中删除关联的原始指针。
std::unique_ptr<Person> pPerson1(new Person("P1"));
std::unique_ptr<Person> pPerson2 = std::make_unique<Person>("P2");
用途:获取被管理的裸指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.get();
用途:释放其关联的原始指针的所有权,并返回原始指针,但是并未delete原始指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.release();
用途:重置unique_ptr为空,并delete原始指针。
std::unique_ptr<Person> pPerson2(new Person("P2"));
Person* pRaw2 = pPerson2.reset();
static std::vector<Person*> Persons;
void AddPerson()
{
auto a = std::make_unique<Person>("Px");
Persons.push_back(a.get());
}
int main()
{
AddPerson();
}
在上面的代码段中,vector容器用来存放Persons类型的指针,执行了AddPerson之后,发现Persons中存放的都是野指针,先说正确的做法:
Persons.push_back(a.release());
那么两者有什么区别呢?