C++11智能指针中的 unique_ptr实例详解
简介
在C++11中,引入了新的智能指针模板类unique_ptr,它能自动管理动态内存,从而避免内存泄漏和野指针等问题。unique_ptr是一个独占式智能指针,它禁止拷贝和赋值,并在生命周期结束时自动释放内存。
本篇文章将详细介绍unique_ptr的使用方法和注意事项,并结合实例进行说明。
unique_ptr的使用
创建unique_ptr
使用unique_ptr最基本的操作是通过new关键字来创建动态内存并将其封装到unique_ptr对象中。创建unique_ptr的方法如下:
std::unique_ptr<int> ptr(new int(10));
上述代码中,我们创建了一个名为ptr的unique_ptr对象,它持有一个动态分配的整型变量,并将其初始化为10。
但是,unique_ptr是独占式智能指针,它禁止拷贝和赋值,因此不能像普通指针一样进行赋值操作。例如,下面的代码是错误的:
std::unique_ptr<int> ptr1(new int(10));
std::unique_ptr<int> ptr2 = ptr1;
由于unique_ptr禁止拷贝和赋值,因此上述代码会导致编译错误。
unique_ptr的释放
unique_ptr在生命周期结束时自动释放动态内存,这个过程叫做unique_ptr的“析构”。unique_ptr的析构函数会自动调用delete操作符,从而释放其所持有的动态内存。下面的代码展示了unique_ptr的析构过程:
{
std::unique_ptr<int> ptr(new int(10));
} // ptr的生命周期结束,指向的动态内存将被自动释放
获取unique_ptr所持有的指针
我们可以通过unique_ptr的get()成员函数来获取unique_ptr所持有的指针。下面的代码展示了如何使用get()函数:
std::unique_ptr<int> ptr(new int(10));
int* p = ptr.get(); // p指向ptr所持有的动态内存
使用unique_ptr作为函数参数
unique_ptr可以作为函数参数传递。由于unique_ptr禁止拷贝和赋值,因此函数参数只能通过引用或移动语义来传递unique_ptr。
下面的代码展示了如何在函数中使用unique_ptr:
void func(std::unique_ptr<int>& ptr) {
// do some operations with ptr
} // ptr的生命周期结束,指向的动态内存将被自动释放
std::unique_ptr<int> ptr(new int(10));
func(ptr); // 传递unique_ptr的引用
将指针交换给unique_ptr
我们可以使用unique_ptr的swap()成员函数将一个指针交换给unique_ptr,这样可以让unique_ptr接管原指针的所有权。
int* p = new int(10);
std::unique_ptr<int> ptr;
ptr.swap(std::unique_ptr<int>(p)); // 将指针p交换给ptr,ptr现在持有p的所有权
重置unique_ptr
unique_ptr提供了reset()函数用于释放原指针并重新指向新的指针。
std::unique_ptr<int> ptr(new int(10));
ptr.reset(new int(20)); // 释放原指针并指向新的指针
unique_ptr的实例
示例一:在函数中返回unique_ptr
下面的代码展示了如何在函数中使用unique_ptr,通过返回unique_ptr来避免内存泄漏的问题。
// 返回一个unique_ptr,该指针持有一个动态分配的字符串对象
std::unique_ptr<std::string> getString() {
std::unique_ptr<std::string> ptr(new std::string("hello world"));
return ptr; // 返回unique_ptr
}
void printString() {
std::unique_ptr<std::string> str = getString(); // 获取返回的unique_ptr
std::cout << *str << std::endl;
} // str的生命周期结束,指向的动态内存将被自动释放
int main() {
printString();
return 0;
}
上述代码中,getString()函数返回一个unique_ptr,该指针持有一个动态分配的字符串对象。由于返回的是unique_ptr,因此函数结束时该指针会被自动释放,从而避免了内存泄漏的问题。
示例二:使用lambda式创建unique_ptr
下面的代码展示了如何使用lambda式来创建unique_ptr对象。
auto ptr = std::unique_ptr<int>(new int(10));
std::unique_ptr<int> ptr2([=]() {
auto p = new int(20);
*p += *ptr;
return p;
}()); // 使用lambda式创建unique_ptr,该指针持有一个动态分配的整型变量
上述代码中,我们首先使用new关键字创建一个动态分配的整型变量,并将其封装到unique_ptr对象中。然后,我们使用lambda式创建了一个新的unique_ptr对象,它持有另一个动态分配的整型变量,该变量的值为原指针的值加上10。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11智能指针中的 unique_ptr实例详解 - Python技术站