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