一、在C++内存管理中:动态分配内存的区域称之为堆内存。new 和 delete 操作的区域是 free store(heap 的子集) malloc 和 free 操作的区域是 heap函数调用过程中产生的本地变量和调用数据的区域称之为栈。...
一、在C++内存管理中:
动态分配内存的区域称之为堆内存。
new 和 delete 操作的区域是 free store(heap 的子集)
malloc 和 free 操作的区域是 heap
函数调用过程中产生的本地变量和调用数据的区域称之为栈。
二、堆内存:
动态内存分配有一定的不确定性(分配时间等),在实时性要求比较高的场合会避免使用。
使用堆上分配内存,内存管理器涉及的操作:
1.分配 2.释放 3.垃圾回收(寻找不使用的内存块,予以自动释放)
c++ 有1,2 java 有1,3
C++释放内存,内存管理器还涉及将连续未使用的内存块合并。

常见的造成内存泄漏的原因:
分支或异常,导致delete 得不到执行
三、栈内存
在大多数x86机器上,栈的增长方向是,高地址---->低地址
调用函数栈内存的变化:
压参数---->压返回地址(下一条指令的地址)-------跳转到新函数---->压入寄存器保留空间(一些保存工作)------>分配本地变量
栈后进先出,不存在内存碎片。
栈展开:
函数执行发生异常的情况,自动调用析构函数,需编译器的支持。EHsc
四、RAII
参考:https://www.jianshu.com/p/b7ffe79498be
利用将对象存储在栈上,自动调用析构函数的方式管理资源

enum class shape_type {
circle,
triangle,
rectangle,
…
};
class shape { … };
class circle : public shape { … };
class triangle : public shape { … };
class rectangle : public shape { … };
shape* create_shape(shape_type type)
{
…
switch (type) {
case shape_type::circle:
return new circle(…);
case shape_type::triangle:
return new triangle(…);
case shape_type::rectangle:
return new rectangle(…);
…
}
}
// 将指针,放到一个本地变量中,确保析构函数会删除该对象
class shape_wrapper {
public:
explicit shape_wrapper(
shape* ptr = nullptr)
: ptr_(ptr) {}
~shape_wrapper()
{
delete ptr_;
}
shape* get() const { return ptr_; }
private:
shape* ptr_;
};
void foo()
{
…
shape_wrapper ptr_wrapper(
create_shape(…));
…
}
View Code
函数执行发生异常的情况
new 和 delete 操作的区域是 free storemalloc 和 free 操作的区域是 heap
本文标题为:c++(1)----堆内存、栈内存
- C++ 数据结构超详细讲解顺序表 2023-03-25
- ubuntu下C/C++获取剩余内存 2023-09-18
- Qt计时器使用方法详解 2023-05-30
- C语言qsort()函数的使用方法详解 2023-04-26
- Easyx实现扫雷游戏 2023-02-06
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C语言详解float类型在内存中的存储方式 2023-03-27
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
