C++内存管理工具primitives怎么用


本篇内容主要讲解“C++内存管理工具primitives怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++内存管理工具primitives怎么用”吧!C/C++中的new和delete的实现过程operator new():第一个参数表示大小,第二个参数表示保证这个函数不抛出异常。注意:构造函数不能直接调用,而析构函数可以直接调用。new[] 与 delete[] 要搭配使用,未搭配使用可能会内存泄漏,泄露的是指针所指向的地方。析构的时候次序会逆反。对于 析构函数 没有意义,new[] 是否对应 delete[] 不重要,但是 当析构函数有意义时,必须对应。placement new 允许我们将对象建构在一个已经分配的内存中。并且没有对应的placement delete。第一部分,本来是分配内存,现在已经分配好了,所以直接返回。::operator new 和::operator delete 全部可以重载,但是不推荐。类中 operator new 也可以重载,实现所需功能,这是最常用的。注意,可以写出多个版本,前提是每一个版本的声明都必须有独特的参数列。(第一参数必须是size_t)只有new所调用的ctor 抛出异常,才会调用这些重载版的 operator delete()。即使 operator delete() 未能一一对应operator new() 也不会出现任何报错。换句话说:放弃处理构造函数抛出的异常。一:想利用类内重载operator new去接管内存的分配,然后利用内存池的观念【即创建出一大段连续空间的内存,然后将其切割成一小段一小段】,将创建的元素对象放在内存池切分好的各分段小内存片中,这样避免了多次调用new而造成生成多个带有cookie的内存空间。通过内存池的观念,可以生成一大段只带有两个头尾cookie的内存空间,而该一大段内存空间又被切分成每一小段的内存空间,且其中的每一小段内存空间片都可以共享这一整体的cookie信息。因为为了能将一大段内存空间切分成一小段一小段,然后通过单向链表的形式串接起来,所以必须多引入一个Screen* next指针。但这又会增加class Screen的大小【增加了4字节】。二:第一个占用了一个指针,浪费空间这个版本通过union关键字来减少使用next而所占耗的内存!注意:上面两个版本的operator delete操作都没有将内存空间回收还回给系统,而是仍然存在的。虽然operator delete操作没有将这些分配的内存空间释放掉,但其仍在控制中即仍可继续重新使用【只不过freeStore或headOfFreeList此时又重新跑回整个一大块内存空间的头端】,所以不算内存泄漏!三:上面的版本不具有复用性将分配特定尺寸区块的memory allocator包装成一个class allocator,这样每个allocator object都是个分配器,体内维护一个free lists,不同类(如下面的class Foo,class Goo等) 里面调用生成的各自allocator objects维护不同的free lists。由上知,class Foo或class Goo其operator new或operator delete最终调用的都是allocator object所维护的free list而进行操作的!另外,class Foo或class Goo中,应注意到:static allocator myAlloc,即myAlloc必须是个静态成员变量,且在类外定义(赋初值)。如果其不是静态成员变量时,则在构建class Foo类对象时,是没办法调用到myAlloc的。因为非静态成员变量只能通过对象调用【但此时Foo对象还没生成又如何调用!!】。而myAllo免费云主机域名c又是用来生成Foo类对象的,所以得通过类名调用即应设置为static类型。而class allocator的如下:四、macro for static allocator(per-class allocator 4)由第三版本知,其黄色部分我们想将其定义为宏操作,进一步简化代码内容:// DECLARE_POOL_ALLOC used in class definition
#define DECLARE_POOL_ALLOC()
public:
void* operator new(size_t size){
return myAlloc.cllocate(size);
}
void operator delete(void* p){
myAlloc.deallocate(p, 0);
}
protected:
static allocator myAlloc;// IMPLEMENT_POOL_ALLOC used in class implementation file
#define IMPLEMENT_POOL_ALLOC(class_name)
allocator class_name::myAlloc;使用实例如图所示:在类内进行宏声明,在类外进行宏定义【告诉编译器传入参数的class type】一个是需要默认版本,另一个是这个函数我不要。这两个函数不仅使用构造,同时适用于 operator new 和 operator delete。到此,相信大家对“C++内存管理工具primitives怎么用”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: OpenCV如何实现物体的凸包检测

这篇文章主要讲解免费云主机域名了“OpenCV如何实现物体的凸包检测”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“OpenCV如何实现物体的凸包检测”吧!什么是凸包?解释:给定二维平面上的点集,凸包就是将最外层…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/02 21:24
下一篇 04/02 21:24

相关推荐