内存管理通常指的是堆上分配的空间,栈上分配虽然高效好用,但一般是固定大小的、不能持久保存的。堆上分配就有了释放的问题,代码中有一些是使用new/malloc来分配空间的,还有一些是使用内存池,如何在释放时区分是必须的。
简单思考以后我感觉首先需要排除delete pObject这种调用,这显然是假定对象是用new分配出来的,或者是对象重载了new/delete操作符。也可以把对象根据分配方式不同放在不同的容器中管理,不过带来了查找上的开销。如果不分类放在容器中,也可以让对象自己知道是如何分配的,再给它一个销毁的函数:
struct Foo {
int allocMethod;
void Destroy() {
switch(allocMethod) {
case ALLOC_NEW: delete this; break;
case ALLOC_MALLOC: // placement delete + free break;
// ... memory pool or object pool
}
};
这么写会很累,每个对象都要知道太多细节,可以考虑把这部分提出来:
struce DestroyCallback {
virtual call(void* p) = 0;
};
struct Foo {
DestroyCallback* destorycb;
void Destory() {
if (destroycb)
destroycb->call(this);
}
};
struct DeleteCallback : public DestroyCallback {
virtual void call(void* p) {
delete static_cast<Foo*>(p);
}
};
struct PoolFreeCallback : public DestroyCallback {
Pool<Foo>* pool;
virtual void call(void* p) {
pool->Release(static_cast<Foo*>(p));
}
};
这种方式在分配对象的时候把destroy callback设置好,需要释放时调用Destroy就可以了,如果对象需要在一个流程中传递并且在最后阶段销毁,这种方式很容易解除前后端分配器的耦合。使用这种方式就需要用Destroy来代替其它销毁对象的方式,因为它并不一定真的表示销毁,对于对象池来说,它完成的是对象的归还。考虑到池对象重用时前需要初始化,我给对象加上一个初始化方法。由于Destroy并不能准确表明对象的生成状态,我改用Open/Close来代替,Open表明一个对象的重生,通常用来初始化一些变量的值,并不是取代构造函数,这特别适合一些需要池化的大对象,Close也不是析构,但它也可以真正完成析构调用。对于一些特殊的应用,还可以在Open里面完成构造函数调用,Close里面完成析构函数调用,如果对象的空间是使用malloc/free来管理的,这种方式就显得特别有用。这种方式还有一个额外的好处,很多C++开发者不喜欢使用异常,但构造函数没有返回值,只能使用异常来表示失败,多一个Open方法可以有一个不使用异常来检查错误的方法。
分享到:
相关推荐
SQL Server 2005中的索引架构:抛开DBCC SHOWCONTIG,使用新的函数.pdf
而在 Scala 的帮助下,这本书并不要求你抛开现有的思维方式另起炉灶,它所做的更像是为你现有的思维方式添砖加瓦,从而令你如虎添翼。 ——Spark committer from Databricks 连城 尽管函数式编程在近十多年用得...
初中语文文摘人生抛开纸枷锁
只不过傅里叶变换以及小波变换都要求要有基函数,而EMD却完全抛开了基函数的束缚,仅仅依据数据自身的时间尺度特征来进行信号分解,具备自适应性。由于无需基函数,EMD几乎可以用于任何类型信号的分解,尤其是在非...
抛开软件让本本变身WiFi热点.docx
操作系统的另类安装--抛开光盘 从硬盘中全新安装 本节目的:实现在无光驱、软驱、U盘,系统分区无论FAT或者NTFS格式下全新安装操作系统
12星座抛开元旦前烦恼的小妙招.doc
操作系统的另类安装如何抛开光盘安装系统.pdf
200601-抛开偏见,正视保健品行业的投资机会_
08.抛开偏见,正视保健品行业的投资机会_
车企战略解读之六大集团篇 抛开销量谈转型 重点规划新能源汽车.pdf
(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了)2、当我们调用一个重载的函数时,又是如何去解析的?(即怎么知道调用的是哪个函数呢)这两个问题是任何...
藏经阁-【云栖精选7月刊】抛开晦涩的算法、模型,让我们来谈谈互联网架构.pdf
食品饮料行业保健品板块投资策略:抛开偏见,正视保健品行业的投资机会-1016-信达证券-60页.pdf
食品饮料行业保健品板块投资策略:抛开偏见,正视保健品行业的投资机会-20191016-信达证券-60页.pdf
200601-抛开偏见,正视保健品行业的投资机会_.pdf
环保工程及服务行业:首单民营企业债券融资支持工具落地!反弹关注业绩估值与流动性改善,长期抛开博弈关注确定性!.pdf
API函数比较复杂,但是如果你想真正成为高手,请抛开MFC,VCL拥抱API吧
只不过傅里叶变换以及小波变换都要求要有基函数,而EMD却完全抛开了基函数的束缚,仅仅依据数据自身的时间尺度特征来进行信号分解,具备自适应性。由于无需基函数,EMD几乎可以用于任何类型信号的分解,尤其是在非...
两种方法教你使用U盘制作Win7系统教程