奇思妙想 · 2024年 6月 15日 0

new申请/初始化对象一定是在堆/托管堆吗?

36 次浏览
  • C++使用new一定是在堆上申请,不过有个特例placement new,它可以指定任何内存区域,不止堆,还包括栈或者全局静态内存区。
  • ObjC使用new或者alloc始终是在堆申请内存。
  • C#根据类型是引用类型还是结构类型(包括基本类型)决定是在托管堆还是栈,二者所处内存区域水火不容。
    例如结构体SomeStruct a = new SomeStruct()是在栈上保存。
  • Java没有结构体,new申请对象一定是托管堆。
  • Swift和C#的设计理念很像,值类型和引用类型分别位于栈和堆。

placement new

  • C++ 支持指定在非堆空间分配对象,此时编译器不会调用析构函数。