C++智能指针
2021-05-10
2 min read
C++智能指针
std::unique_ptr
C++11提供了三种智能指针, 分别为: shared_ptr, weak_ptr 与 unique_ptr, 以方便内存管理,避免仅使用裸指针可能产生的隐患;
在开发实践中, 为明确内存资源所有权, 我们推荐多使用 unique_ptr , 其他两个智能指针尽量少用, 可将 std::unique_ptr 与裸指针搭配使用, 其中 std::unique_ptr 负责内存的管理, 而裸指针仅负责内存的使用, 这样所有权明确, 减少了问题发生的可能性;
同时, std::unique_ptr 体现了C++RAII的思想精髓,实现了资源的自动管理, 其思想值得在开发实践中学习借鉴;
示例代码
关于 C++11/14 中智能指针使用对于代码的改善如下所示:
// C++98/03 风格
class Demo {
public:
Demo() {
m_mem = new Mem();
}
~Demo() {
// 很有可能忘记此步骤
if (m_mem) {
delete m_mem;
}
}
// ...
private:
Mem* m_mem;
// ...
};
int main()
{
Demo* demo1 = new Demo();
Demo* demo2 = new Demo();
std::vector<Demo*> vec;
vec.push_back(demo1);
vec.push_back(demo2);
// ...
// 很有可能忘记此步骤
for (Demo* ptrDemo : vec) {
delete ptrDemo;
}
return 0;
}
// C++11/14 风格
class Demo {
public:
Demo() {
m_mem = std::make_unique<Mem>();
}
~Demo() {
// 内存由 unique_ptr 自动管理, 无需开发者手动释放
// do other things
}
// ...
private:
std::unique_ptr<Mem> m_mem;
// ...
};
int main()
{
std::unique_ptr<Demo> demo1 = std::make_unique<Demo>();
std::unique_ptr<Demo> demo2 = std::make_unique<Demo>();
std::vector<std::unique_ptr<Demo>> vec;
vec.push_back(std::move(demo1));
vec.push_back(std::move(demo2);
assert(demo1 == nullptr);
assert(demo2 == nullptr);
// ...
return 0;
}
版权声明:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!