C++语言内存管理
小标 2018-07-20 来源 : 阅读 849 评论 0

摘要:本文主要向大家介绍了C++语言内存管理,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

本文主要向大家介绍了C++语言内存管理,通过具体的内容向大家展示,希望对大家学习C++语言有所帮助。

    C++之所以难使用除了语法太复杂之外,另一个原因就是内存管理需要程序员自己控制了。也正式因为拷贝构造函数的存在,使得很多时候,不注意就陷入了拷贝构造函数带来的空指针异常。所以尽量避免拷贝构造函数的使用,会使得内存管理更加方便,约定一些规范去使用C++,会使C++更加容易使用。

    使用引用计数来管理内存是一种常见的内存回收算法,也是比较容易实现的算法。下面就是一个简单的引用计数内存回收实现。

    我创建了一个基类,项目所有的自定义类必须继承该类,并且自定义类的拷贝构造函数必须设置为private。

    

//// 通过引用计数来完成C++的自动内存回收,这是所有自定义类的基类//

#ifndef CLUSTER_CHAT_HARDREFERENCE_H#define CLUSTER_CHAT_HARDREFERENCE_H

 

#include <zconf.h>

class HardReference {public:

    HardReference();

    virtual HardReference* obtain();

    virtual void release();

    virtual ~HardReference();protected:

    uint mHardReferenceCount;

private:

    HardReference(HardReference* hardReference);

};

 

#endif //CLUSTER_CHAT_HARDREFERENCE_H

 

 

//// 通过引用计数来完成C++的自动内存回收,这是所有自定义类的基类//

#include "HardReference.h"

 

HardReference::HardReference() {

    this->mHardReferenceCount = 1;

}

/**

 * 注意,这个拷贝构造函数使用private修饰符,阻止了拷贝函数的调用

**/

HardReference::HardReference(HardReference *hardReference) {

 

}

 

HardReference::~HardReference() {

    this->mHardReferenceCount = 0;

}

/**

 * 如果想把自身拷贝给别人的话,只能通过指针方式传递出去,

 * 因为拷贝构造函数已经被设置为private,

 * 子类的拷贝构造函数也必须要设置为private

**/

HardReference* HardReference::obtain() {

    this->mHardReferenceCount++;

    return this;

}

/**

 * 添加(mHardReferenceCount > 0),防止多次析构函数的调用

**/void HardReference::release() {

    if (this->mHardReferenceCount > 0) {

        this->mHardReferenceCount--;

        if (this->mHardReferenceCount <= 0) {

            delete this;

        }

    }

 

}

 

 

    在使用继承HardReference时,子类的拷贝构造函数必须是private的,如下:

//// 继承HardReference,并把拷贝构造函数设置为private,必须通过指针传递//

#ifndef CLUSTER_CHAT_SESSION_H#define CLUSTER_CHAT_SESSION_H

#include "base/HardReference.h"

class Session : public HardReference{public:

    Session(const char *message);

    void toString();

    ~Session();

protected:

    char* mMessage;

private:

    Session(Session &session);

};

 

#endif //CLUSTER_CHAT_SESSION_H

 

 

    在使用时,不要使用delete来主动调用对象的析构函数,而是通过obtain和release方法来获取指针引用和调用析构函数。通过这种方式避免存在有效指针引用的情况下,析构函数就被调用了。

    使用案例:

    

#include <iostream>#include "Session.h"

using namespace std;

int main() {

    Session *session = new Session("Hello World!");

    Session *session1 = (Session*) session->obtain();

    session->toString();

    session->release();

    session1->toString();

    session1->release();

    return 0;

}

 

    每次的指针传递必须使用obtain来获取传递,而且obtain和release是成对出现的,这样有效的避免了内存泄露,而且内存的自动回收也得到实现。

以上就介绍了C/C+的相关知识,希望对C/C+有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程