@songying
2019-01-28T14:12:40.000000Z
字数 760
阅读 1049
c++
c++ 中内存分为两部分:
- 堆:在函数内部声明的所有变量都将占用栈内存。
- 栈:这是程序中未使用的内存,在程序运行时可用于动态分配内存。
你可以使用new与delete 来为给定类型的变量在运行时分配堆内的内存
new data_type; // data-type 可以使包括数组在内的任意内置数据类型以及用户定义的类与结构体
当我们new 一个对象时,实际执行了三步:
- new 调用了一个名为
operator new(或 operator new[])
的标准库函数,该函数分配一块足够大,原始的,未命名的内存空间以便存储特定类型的对象(或对象数组)。- 编译器运行下相应的构造函数以构造这些对象,并为其传入初始值。
- 对象被分配了空间并构造完成,返回一个指向该对象的指针
可以通过重载new 运算符与delete运算符控制内存分配过程。
当我们采用delete 运算符删除一个对象时,实际执行了两步:
- 对sp所指的对象或arr所指的数组中的元素执行对应的析构函数。
- 编译器调用名为
operator delete(或 operator delete [])
的标准库函数释放内存空间
我们可以通过定义自己的 operator new
和 operator delete
函数来实现对内存的分配。
当编译器发现一条new 或delete 表达式时,会在代码中查找可供调用的operator函数。
- 如果对象是类类型,则编译器先在类及基类的作用域中查找。若类中有
operator new
或operator delete
成员,则会调用。- 如果在类中没有找到,则编译器会在全局作用域中查找匹配的函数,如果找到了,则使用。
- 如果未找到,则使用标准库版本