近来由于项目需要,采用c++编程,学习了一下stl,对stl::allocator粗略研究了一下,allocator其实就是一个工厂模式,对它的几个方法粗略分析一下
pointer allocate(size_type n, const_pointer = 0) {
void* p = std::malloc(n * sizeof(T)); //只分配对象占用的内存,并不初始化,不调用构造函数
if (!p)
throw std::bad_alloc();
return static_cast<pointer>(p);
}
void deallocate(pointer p, size_type) {
std::free(p); //释放内存,并不调用析构函数
}
显然上面的方法如果是对基本类型是可以接受的,但如果是类对象这些,没有调用构造、析构函数是不可接受的。看看stl是如何处理的。
void construct(pointer p, const value_type& x) {
/*这个new比较特殊,并没有分配内存,只是将其按x值初始化,基本类型没有什么特殊,如果是类,则需要注意拷贝构造函数*/
new(p) value_type(x);
}
void destroy(pointer p) {
p->~value_type(); //这个就有点特殊了,如果是基本类型,也有析构函数?
}
带着上面的疑问,翻阅了<<c++标准98>>,在12.4节193页发现以下用法
typedef int I ;
I* p ;
.......
p->I::~I();
也就是说c++标准允许不知道是否有析构函数都可以这样写,这就大大解决了通用库设计中的一些问题,c++中还是很多东西自己不了解。
分享到:
相关推荐
析构函数是类的一个特殊成员函数,当对象生命周期结束时(通常是对象超出作用域或显式删除),系统会自动调用析构函数,用于清理对象可能占用的资源。通过在析构函数中释放内存和关闭文件等操作,实现确定性的资源...
当对象不再需要时,它会调用析构函数。 2. **内存分配与释放**:分配器必须能够根据需求分配和释放内存块,确保内存的有效管理。 3. **内存基本处理工具**:除了基础的分配和释放,分配器还可能提供一些辅助工具,如...
8. **析构函数为虚函数**:在多态性中,子类的对象被当作基类对象处理时,如果析构函数是虚函数,可以正确调用子类的析构函数。 9. **构造函数不调用虚函数**:因为构造过程中对象尚未完全初始化,调用虚函数可能...
2. 构造与析构函数:构造函数用于在对象创建时初始化对象,而析构函数用于对象销毁前执行必要的清理工作。C++允许构造函数重载,并且还提供了默认构造函数和拷贝构造函数。 3. 类型转换:C++支持多种类型转换操作,...
- `delete` 用于释放内存,并调用析构函数。 - **`placement new/delete`**: - `placement new` 允许在已经分配好的内存上构建对象,不执行默认的内存分配行为。 - `placement delete` 只负责调用对象的析构函数...
- 构造函数与析构函数:掌握对象生命周期的管理。 - 静态成员和友元:理解静态成员变量和静态成员函数的作用,以及友元的作用。 6. **模板与异常处理**: - 模板:学习函数模板和类模板,实现泛型编程。 - 异常...
分配器需要在分配内存后调用对象的构造函数,释放内存前调用析构函数。 5. 效率优化:为了进一步提高效率,可以引入线程局部存储(TLS)或锁-free的数据结构,减少多线程环境下的同步开销。 在"VC2010-08-25-小块...
- `delete`运算符同样分为两步:调用析构函数,然后调用全局`::operator delete`释放内存。 **3. STL中迭代器的删除操作** - **vector**: 删除元素后,所有后续迭代器都失效,但erase()会返回下一个有效迭代器。 -...
析构函数在对象生命周期结束时自动调用,用于清理资源。 6. **继承与多态**:继承允许一个类(子类)从另一个类(父类)继承属性和行为,实现代码重用。多态是指子类对象能够替换其基类对象,同时保持其特有的行为...
理解类的构造函数、析构函数、成员函数、数据成员以及访问修饰符(public, private, protected)的概念。 - 继承:通过继承,一个类可以扩展或修改另一个类的特性,实现代码重用和类的层次结构。 - 多态性:多态性...
6. **构造与析构函数**:对象生命周期中的初始化和清理,以及默认构造函数、拷贝构造函数、移动构造函数的理解。 7. **运算符重载**:如何为自定义类型定义新的运算符行为,以及重载规则。 8. **模板**:函数模板...
- 构造函数与析构函数 - 成员函数(公有、私有、受保护访问权限) - 静态成员与常量成员 - 继承(单一继承、多重继承、虚基类) - 多态性(虚函数、纯虚函数、动态绑定) - 友元(类与函数) 3. **模板**...
4. **析构函数** 当`vector`离开作用域或显式调用`~vector()`时,它会销毁所有元素并释放内存。 5. **成员函数** - `assign`: 用新的元素替换现有元素。 - `at()`: 访问指定索引的元素,若越界则抛出异常。 - `...
- 构造函数(Constructors)、临时对象(Temporary objects)、转换(Conversions)、析构函数(Destructors)、自由存储(Free store)、初始化(Initialization)、构造和析构(Construction and destruction)、...