C++的内存分配
来源:互联网 发布:阿里云服务器国际版 编辑:程序博客网 时间:2024/06/08 02:53
C++的内存分配有两种方法(分配和释放未构造的原始内存):
1)allocator类,2)new 和delete
第一种:
allocator类的定制算法:
allocator<T>a :定义分配类型为T的分配对象a;
a.allocate(n) : 分配T类型的n个空间,不调用类型的构造函数;
a.deallocate(p,n): 释放在T*的p指针处的n个对象所具有的内存空间,不用类型析构函数,在此这之前调用对象的析构函数是用户的责任 ;
a.construct(p,t) : 在T*的p指针处调用类型的复制构造函数用t初始化该对象;
a.destroy(p): 调用T*的p指针所指对象的析构函数;
uninitialized_copy(b,e,b2): 从迭代器b和e之间的元素复制构造到迭代器b2中;
uninitialzed_fill(b,e,t):
uninitialzed_fill_n(b,e,t,n):
下面用vector的内存分配策略来理解allocator类:
template<class T>class Vector {
public:
Vector():elements(0),first_free(0),end(0) {}
void push_back(const T&) ;
private:
static std::allocator<T>alloc ;
void reallocate() ;
T* elements ;
T* first_free ;
T* end ;
} ;
使用construct:
template<class T>
void Vector<T>::push_back(const T&)
{
if(first_free == end)
reallocate() ;
alloc.construct(first_free,t) ;
++first_free ;
}
重新分配元素与复制元素:
template<class T>
void Vector<T>::reallocte()
{
std::ptrdiff_t size = first_free-elements ;
std::ptrdiff_t newcapacity = 2 * max(size,1) ;
T* newelements = alloc.allocate(newcapacity) ;
uninitialized_copy(elements,first_free,newelements) ;
for(T* p = first_free ; p!= elements;)
alloc.destroy(--p) ;
if(elements)
alloc.deallocate(elements,end-elements) ;
elements = newelements ;
first_free = newelements+size ;
end = newelements+newcapacity ;
}
第二种:
new和delete会自动调用对象的构造函数和析构函数的;是运算符,可重载;
- C的内存分配
- c的内存分配函数
- C的内存分配问题
- C程序的内存分配
- c的堆栈,内存分配
- C UDR 的内存分配
- c的内存分配问题
- C程序的内存分配
- c 程序的内存分配
- C语言的内存分配
- c/c++的内存分配
- C语言的内存分配
- c语言的内存分配
- C语言的内存分配
- C的堆栈,内存分配
- C的内存分配问题
- c的堆栈,内存分配
- C程序的内存分配
- 求救!!!!linux高手请帮忙!!!
- 继承System.Web.UI.Page的页面基类
- DBHelper类的关闭问题
- 汇编语言指令集
- JavaScript实例教程2
- C++的内存分配
- 格式化输出函数: Format
- JMS简明学习教程
- Making a CAB file which doesn’t prompt for installation location
- 暑假数据库知识小结
- ASP.NET控件开发
- 批处理查杀不正常svchost进程
- sql anywhere 的unload和reload(数据迁移) 用微软sql server 的DTS实现从 ORACLE导出数据到Sql Anywhere数据库中
- Oracle实战练习(续二)