c++智能指针怎么用-创新互联

这篇文章主要介绍“c++智能指针怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c++智能指针怎么用”文章能帮助大家解决问题。

成都创新互联长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为工布江达企业提供专业的网站制作、网站建设工布江达网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。

        我们在程序开发中,难免会遇到内存泄漏。那么什么是内存泄漏呢?就是动态申请堆空间,用完后不归还。在 C++ 语言中没有垃圾回收机制,在后续的语言如 Java、C# 等高级语言中就存在垃圾回收机制,指针无法控制所指堆空间的生命周期。

        下来我们来看个示例代码

#include 
#include 

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;
    }
};

int main()
{
    for(int i=0; i<5; i++)
    {
        Test* p = new Test(i);
        
        cout << p->value() << endl;
    }
    
    return 0;
}

        我们明显看到在 main 函数中只 new 对象了,而没有 delete 对象。我们看看运行结果

c++智能指针怎么用

        我们看到只是进行了构造函数,并没有析构函数的打印。也就是说,有内存泄漏,但是有人会说我们的程序还是运行结束了,啥事都没有。这是因为这个程序很短,如果程序在长时间运行后,便会产生问题,而且这类问题是最难调试的。

        那么我们就会思考了:我们到底需要的是一个什么样的指针的?需要一个特殊的指针,在指针生命周期结束时能主动释放堆空间。一片堆空间最多只能由一个指针标识,必须杜绝指针运算和指针比较。那么解决方案便是重载指针特征操作符(-> 和 *),只能通过类的成员函数重载,并且重载函数不能使用参数它只能定义一个重载函数。我们称之为智能指针,下来我们来看看智能指针到底是什么样的

#include 
#include 

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(obj).mp = NULL;
    }
    Pointer& operator = (const Pointer& obj)
    {
        if( this != &obj )
        {
            delete mp;
            mp = obj.mp;
            const_cast(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(5);
    
    cout << p1->value() << endl;
    
    Pointer p2 = p1;
    
    cout << p1.isNull() << endl;
    
    cout << p2->value() << endl;
    
    return 0;
}

        我们在程序中定义了一个 Pointer 类,进行了一系列的操作符重载。打印 p1 的值就肯定为 5,接着将 p1 赋值给 p2,那么此时 p1 就应该为空了,因为一片空间只能有一个标识符。所以在第 78 行打印出的肯定是 1 了,最后打印的 p2 的值也就为 5 了。我们看看编译结果

c++智能指针怎么用

关于“c++智能指针怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注创新互联行业资讯频道,小编每天都会为大家更新不同的知识点。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前文章:c++智能指针怎么用-创新互联
文章路径:http://azwzsj.com/article/ddhhis.html