zoukankan      html  css  js  c++  java
  • C++内存管理 | 01 C++ memory primitives

    几种内存分配的形式

    MSVC下:

    #include <iostream>
    #include <string>
    #include <set>
    #include <complex>
    using namespace std;
    
    int main() {
        // 1. 利用malloc free C函数, 不可重载
        void* p1 = malloc(512); // 分配512字节
        free(p1);
    
        // 2. new delete C++表达式, 不可重载
        auto p2 = new complex<int>; // 分配对象
        delete p2;
    
        // 3. C++函数, 可以重载
        void* p3 = ::operator new(512); // 512Bytes
        ::operator delete(p3);
    
        // 4. C++标准库, 可以自由搭配容器
        int *p4 = allocator<int>().allocate(5, nullptr);
        allocator<int>().deallocate(p4, 5);
    }
    
    

    MSVC中对于allocator有两种形式的重载,

    第二参数可以接受一个指针.

    对于GNU C, 可通过内存池进行内存分配:

    #include <iostream>
    #include <complex>
    #include<ext/pool_allocator.h>
    using namespace std;
    
    int main() {
        // 1. 利用malloc free C函数, 不可重载
        void* p1 = malloc(512); // 分配512字节
        free(p1);
    
        // 2. new delete C++表达式, 不可重载
        auto p2 = new complex<int>; // 分配对象
        delete p2;
    
        // 3. C++函数, 可以重载
        void* p3 = ::operator new(512); // 512Bytes
        ::operator delete(p3);
    
        // 4. C++标准库, 可以自由搭配容器
        int *p4 = allocator<int>().allocate(5, nullptr);
        allocator<int>().deallocate(p4, 5);
    
        // 5. 内存池, gcc下可通过__poll_alloc分配
        void* p5 = __gnu_cxx::__pool_alloc<int>().allocate(9); // 分配9个ints
        __gnu_cxx::__pool_alloc<int>().deallocate(static_cast<int *>(p5), 9);
    }
    
  • 相关阅读:
    Delphi 简体 繁体 转换
    简单地为DBNavigator填加Caption
    TEdit的 Clear 和 赋值 ''
    SSH服务端
    动态模块导入示例、断言
    异常处理
    反射、getattr
    类的各种自带方法,静态方法,属性方法,类方法等
    类的继承,深度优先于广度优先
    类变量与实例变量、析构函数、私有属性与私有方法
  • 原文地址:https://www.cnblogs.com/tedukuri/p/12997148.html
Copyright © 2011-2022 走看看