C++:内存管理与模板初阶

目录

一:new 和 delete

二:operator new与operator delect函数

三:malloc/free 和 new/delect的区别

模板


  1. 栈又叫堆栈--存储非静态局部变量/函数参数/返回值等,栈是向下增长的
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
  3. 堆用于程序运行时动态内存分配,堆是可以向上增长的
  4. 数据段--存储全局数据和静态数据
  5. 代码段--可执行的代码。只读常量

一:new 和 delete

void test()
{
    int* p1 = new int;
    int* p2 = new int(1);
    int* p3 = new int[5];
    int* p4 = new int[5]{ 1,2,3 };

    delete p1;
    delete p2;
    delete[] p3;
    delete[] p4;
}

new  和 delete 都是操作符,并不是函数

第一个是直接申请一个int, 第二个是申请一个int 并且初始化为 5,第三个是申请 5 个int 的数组, 第四个是申请5个int的数组并且初始化

申请和释放连续的空间,需要使用new[],delete[]。

对于内置类型,new / delete与malloc / free 的作用完全相同,都是在堆上申请空间,只有用法的区别。但是对于自定义类型new和delect中的new可以自动调用构造函数去初始化类。delect会先调用析构函数,再去释放空间。

new失败不需要检查返回值,它失败抛出异常。


二:operator new与operator delect函数

new和delect是用户进行动态内存申请和释放的操作服,operator new和operator delect是系统提供的全局函数,new在底层调用operator new全局函数来申请空间, delect在底层通过operator delect全局函数来释放空间。

operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delect最终是通过free来释放空间的。


三:malloc/free 和 new/delect的区别

malloc/free 和 new/delect的共同点是:都是从堆上申请空间,并且需要用户手动释放,不同的地方是:

  1. malloc和free是函数,new和delect是操作符
  2. malloc申请的空间不会初始化,new可以初始化
  3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可,如果是多个对象,[]中指定对象个数即可。
  4. malloc的返回值是void*,在使用时必须强转,new不需要,因为new后面跟的是空间的类型
  5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
  6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delect在释放空间前会调用析构函数完成空间中资源的清理释放

模板

函数模板允许定义可以处理多种数据类型的函数:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

// 使用
int i = max(10, 5);           // 调用 max<int>
double d = max(10.5, 20.3);    // 调用 max<double>

类模板允许定义可以处理多种数据类型的类:

template <typename T>
class Stack {
private:
    std::vector<T> elements;
public:
    void push(T const& elem) {
        elements.push_back(elem);
    }
    void pop() {
        if (!elements.empty()) {
            elements.pop_back();
        }
    }
    T top() const {
        if (!elements.empty()) {
            return elements.back();
        }
        throw std::out_of_range("Stack<>::top(): empty stack");
    }
};

// 使用
Stack<int> intStack;       // int 类型的栈
Stack<std::string> strStack; // string 类型的栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值