C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++智能指针

C++超详细讲解智能指针

作者:清风自在 流水潺潺

为了解决内存泄漏的问题,C++中提出了智能指针。内存泄漏的产生原因有很多,即使我们正确的使用malloc和free关键字也有可能产生内存泄漏,如在malloc和free之间如果存在抛异常,那也会产生内存泄漏。这种问题被称为异常安全

一、内存泄漏-永恒的话题

下面看一段内存泄漏的代码:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int i;
public:
    Test(int i)
    {
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
    }
};
int main()
{
    for(int i=0; i<5; i++)
    {
        Test* p = new Test(i);        
        cout << p->value() << endl;      
    }    
    return 0;
}

输出结果如下:

二、深度思考

三、智能指针分析

解决方案

下面看一段智能指针的使用示例:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int i;
public:
    Test(int i)
    {
        cout << "Test(int i)" << endl;
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }
};
class Pointer
{
    Test* mp;
public:
    Pointer(Test* p = NULL)
    {
        mp = p;
    }
    Pointer(const Pointer& obj)
    {
        mp = obj.mp;
        const_cast<Pointer&>(obj).mp = NULL;
    }
    Pointer& operator = (const Pointer& obj)
    {
        if (this != &obj)
        {
            delete mp;
            mp = obj.mp;
            const_cast<Pointer&>(obj).mp = NULL;
        }
        return *this;
    }
    Test* operator -> ()
    {
        return mp;
    }
    Test& operator * ()
    {
        return *mp;
    }
    bool isNull()
    {
        return (mp == NULL);
    }
    ~Pointer()
    {
        delete mp;
    }
};
int main()
{
    Pointer p1 = new Test(0);
    cout << p1->value() << endl;
    Pointer p2 = p1;
    cout << p1.isNull() << endl;
    cout << p2->value() << endl;
    return 0;
}

输出结果如下:

注意这两行代码的含义,

mp = obj.mp;
const_cast<Pointer&>(obj).mp = NULL;

表明当前对象的成员指针指向初始化对象的成员指针所对应的堆空间,这就两个智能指针对象指向了同一片堆空间,然后 const_cast<Pointer&>(obj).mp = NULL; 表明初始化对象把自己管理的堆空间交给当前对象。这就完成了前面说的“一片堆空间最多只能由一个指针标识”。

智能指针使用的军规:只能用来指向堆空间中的对象或者变量

四、小结

到此这篇关于C++超详细讲解智能指针的文章就介绍到这了,更多相关C++智能指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文