一、引言
在软件开发与系统运维的广阔领域中,内存安全是基石亦是挑战。随着软件复杂度的增加,内存泄露、缓冲区溢出、越界访问等安全问题频发,不仅影响程序稳定性,更可能成为黑客攻击的入口。确保内存安全,意味着守护数据完整、预防系统崩溃,更是保障用户体验与业务连续性的关键。因此,深入探讨内存安全机制,采用先进防护技术,构建安全的内存使用环境,是每一位开发者与运维人员不可或缺的技能与责任。
C/C++语言可以方便的操作内存(通过指针等),因此能得到较高的运行效率。而指针是一把双刃剑,因为指针导致的问题也层出不穷,成为一个不可以绕过的问题。关于解决这个问题,C++也一直在努力,今天我们就来看看C++11中新增的智能指针。
二、简单的原理演示
C++中的智能指针其实是应用了“类对象出作用域后会自动调用其析构函数”的特点,将内存资源回收放在智能指针的析构函数中。以下是一个简单的自定义智能指针,旨在为了帮助大家理解其基本原理。
// 简单的智能指针
#include <iostream>
template <typename T>
class MyPointer{
private:
T* pointer_;
public:
MyPointer(T *p): pointer_(p){
}
~MyPointer(){
delete pointer_;
std::cout << "pointer_ destroy.";
}
};
int main(){
MyPointer<int> p(new int(10));
} // p对象会在这里析构,自动调用析构函数
三、unique_ptr智能指针
std::unique_ptr 是 C++11 引入的一种智能指针,用于自动管理具有唯一所有权的动态分配的对象。所有的智能指针都在<memory>头文件中声明。
std::unique_ptr 保证其指向的对象在 unique_ptr 被销毁时自动被删除,从而避免了内存泄漏。与 std::shared_ptr 不同,std::unique_ptr 不可被复制(即,不能有两个 unique_ptr 指向同一个对象),但可以被移动(move),这允许 unique_ptr 的所有权在不同作用域之间转移。
基本用法
创建 std::unique_ptr
#include <memory>
int main() {
// 使用 new 分配的内存初始化 unique_ptr
std::unique_ptr<int> ptr(new int(10));
// 使用 std::make_unique (C++14 及以后)
auto ptr2 = std::make_unique<int>(20);