`
xieyj
  • 浏览: 103057 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

stl::allocator析构函数调用

阅读更多

  近来由于项目需要,采用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
1
分享到:
评论

相关推荐

    VC++ 2005系列课程(4):确定性资源清理

    析构函数是类的一个特殊成员函数,当对象生命周期结束时(通常是对象超出作用域或显式删除),系统会自动调用析构函数,用于清理对象可能占用的资源。通过在析构函数中释放内存和关闭文件等操作,实现确定性的资源...

    STL源码剖析终稿621

    当对象不再需要时,它会调用析构函数。 2. **内存分配与释放**:分配器必须能够根据需求分配和释放内存块,确保内存的有效管理。 3. **内存基本处理工具**:除了基础的分配和释放,分配器还可能提供一些辅助工具,如...

    百度校园招聘历年经典面试题汇总:C++研发 1

    8. **析构函数为虚函数**:在多态性中,子类的对象被当作基类对象处理时,如果析构函数是虚函数,可以正确调用子类的析构函数。 9. **构造函数不调用虚函数**:因为构造过程中对象尚未完全初始化,调用虚函数可能...

    2021年面试常问的C++知识点大全.pdf

    2. 构造与析构函数:构造函数用于在对象创建时初始化对象,而析构函数用于对象销毁前执行必要的清理工作。C++允许构造函数重载,并且还提供了默认构造函数和拷贝构造函数。 3. 类型转换:C++支持多种类型转换操作,...

    memory-nanjing-2012.pdf

    - `delete` 用于释放内存,并调用析构函数。 - **`placement new/delete`**: - `placement new` 允许在已经分配好的内存上构建对象,不执行默认的内存分配行为。 - `placement delete` 只负责调用对象的析构函数...

    C++编程实例100篇5.rar

    - 构造函数与析构函数:掌握对象生命周期的管理。 - 静态成员和友元:理解静态成员变量和静态成员函数的作用,以及友元的作用。 6. **模板与异常处理**: - 模板:学习函数模板和类模板,实现泛型编程。 - 异常...

    小块内存分配器设计与实现C++源代码程序小实例

    分配器需要在分配内存后调用对象的构造函数,释放内存前调用析构函数。 5. 效率优化:为了进一步提高效率,可以引入线程局部存储(TLS)或锁-free的数据结构,减少多线程环境下的同步开销。 在"VC2010-08-25-小块...

    容器和算法面经.docx

    - `delete`运算符同样分为两步:调用析构函数,然后调用全局`::operator delete`释放内存。 **3. STL中迭代器的删除操作** - **vector**: 删除元素后,所有后续迭代器都失效,但erase()会返回下一个有效迭代器。 -...

    Think in C++ PDF 第二版第一、第二卷(英文)

    析构函数在对象生命周期结束时自动调用,用于清理资源。 6. **继承与多态**:继承允许一个类(子类)从另一个类(父类)继承属性和行为,实现代码重用。多态是指子类对象能够替换其基类对象,同时保持其特有的行为...

    VisualC++实效编程百例 ch5

    理解类的构造函数、析构函数、成员函数、数据成员以及访问修饰符(public, private, protected)的概念。 - 继承:通过继承,一个类可以扩展或修改另一个类的特性,实现代码重用和类的层次结构。 - 多态性:多态性...

    最全的常见C++面试题

    6. **构造与析构函数**:对象生命周期中的初始化和清理,以及默认构造函数、拷贝构造函数、移动构造函数的理解。 7. **运算符重载**:如何为自定义类型定义新的运算符行为,以及重载规则。 8. **模板**:函数模板...

    《C++核心思想》书本代码

    - 构造函数与析构函数 - 成员函数(公有、私有、受保护访问权限) - 静态成员与常量成员 - 继承(单一继承、多重继承、虚基类) - 多态性(虚函数、纯虚函数、动态绑定) - 友元(类与函数) 3. **模板**...

    C++中vector容器使用详细说明

    4. **析构函数** 当`vector`离开作用域或显式调用`~vector()`时,它会销毁所有元素并释放内存。 5. **成员函数** - `assign`: 用新的元素替换现有元素。 - `at()`: 访问指定索引的元素,若越界则抛出异常。 - `...

    C++ 标准 ISO 14882-2011

    - 构造函数(Constructors)、临时对象(Temporary objects)、转换(Conversions)、析构函数(Destructors)、自由存储(Free store)、初始化(Initialization)、构造和析构(Construction and destruction)、...

Global site tag (gtag.js) - Google Analytics