网站建设uuiop,长春做网站企业,怎样做公众号,网站建设投标方案目录
一.程序启动所关联的内存分区
二.动态内存的申请和释放
三.将RAII思想融入代码
四.RAII思想的简单应用
一.程序启动所关联的内存分区
.dll文件是Dynamic Link Library#xff08;动态链接库#xff09;文件的缩写#xff0c;它是一种共享库文件#xff0c;包含…目录
一.程序启动所关联的内存分区
二.动态内存的申请和释放
三.将RAII思想融入代码
四.RAII思想的简单应用
一.程序启动所关联的内存分区
.dll文件是Dynamic Link Library动态链接库文件的缩写它是一种共享库文件包含了程序所需的代码和数据。与静态链接库不同动态链接库可以在程序运行时动态加载使得程序的内存占用更小同时也方便了程序的更新和维护。
程序启动时系统会将exe主程序依赖的所有dill库文件加载到进程的代码段的内存区中这些文件里存放的是可执行的二进制机器码也就是汇编代码。
等到所有的dill模块都加载完毕后才将exe主程序加载到进程空间之后启动C/C运行时库然后给全局变量分配内存并执行全局变量的初始化操作此处对应的是全局内存区然后才会进入到main函数程序启动。
当执行函数时在当前线程栈内存上给函数的局部变量申请栈内存如果执行的是malloc或者new的代码申请的就是堆内存。
二.动态内存的申请和释放
在C/C中动态申请的内存是需要开发人员自己去管理的即使用完毕后需要手动去释放否则就会造成内存泄漏产生严重bug。
三.C中使用new去申请内存用delete来释放内存
C在支持malloc和free动态申请内存的基础上新增new和delete两种方式new主要是用来new出一个C对象来也就是在堆内存上申请一个C对象的内存不用时调用delete释放掉。
new一个C对象时不仅会在堆上申请内存还会调用该对象的构造函数具体来说是先申请内存再调用构造函数。
同样的delete时会调用该对象的析构函数具体来说是先调用析构函数然后释放掉对象所占堆内存。
需要注意的是new出来的对象不会自动调用析构函数需要我们手动去delete。
三.将RAII思想融入代码
这样一来如果程序很复杂那delete就会很繁琐并且容易出错所以我们编程时就需要融入RAII(Resource Acquistion Is Intialization)思想。
当我们在main函数中声明一个局部对象的时候会自动调用构造函数进行对象的初始化当整个main函数执行完成后自动调用析构函数来销毁对象整个过程无需人工介入由操作系统自动完成于是很自然联想到当我们在使用资源的时候在构造函数中进行初始化在析构函数中进行销毁。整个RAII过程我总结四个步骤
a.设计一个类封装资源
b.在构造函数中初始化
c.在析构函数中执行销毁操作
d.使用时声明一个该对象的类
下面是基于RAII思想实现的一个简单的互斥锁。
四.RAII思想的简单应用
#includepthread.h
#includeiostreamclass Mutex
{
private:/* data */pthread_mutex_t *_mutex;
public:Mutex(pthread_mutex_t *mutex);~Mutex();void Lock(){std::coutInitialize Successstd::endl;pthread_mutex_lock(_mutex);}void UnLock(){std::coutDelete Successstd::endl;pthread_mutex_unlock(_mutex);}
};Mutex::Mutex(pthread_mutex_t* mutex) :_mutex(mutex)
{}Mutex::~Mutex()
{}class LockGuard
{
private:Mutex _mutex;
public:LockGuard(pthread_mutex_t *mutex);~LockGuard();
};LockGuard::LockGuard(pthread_mutex_t* mutex) :_mutex(mutex)
{_mutex.Lock();
}LockGuard::~LockGuard()
{_mutex.UnLock();
}int main()
{pthread_mutex_t mutex;LockGuard lockGuard(mutex);return 0;
}运行代码自动调用构造函数和析构函数不用我们手动删除非常方便。
需要注意Delete Success是在return 0之后才打印的。