我的理解一直是,无论是 C++、C# 还是 Java,当我们使用 new
关键字创建对象时,它都会在堆上分配内存。我认为 new
只有引用类型(类)才需要,而原始类型(int、bool、float 等)从不使用 new
并且总是继续堆栈(除非它们是使用 new
实例化的类的成员变量)。但是,我一直在阅读information这让我怀疑这个长期存在的假设,至少对于 Java 和 C#。
例如,我刚刚注意到在 C# 中 new
运算符可用于初始化值类型,请参阅 here .这是否是规则的异常(exception),语言的辅助功能,如果是,还会有哪些其他异常(exception)?
有人可以澄清一下吗?
最佳答案
I thought that new is only needed for reference types (classes), and that primitive types (int, bool, float, etc.) never use new
在 C++ 中,您可以根据需要在堆上分配原始类型:
int* p = new int(42);
如果您想要一个共享计数器,这很有用,例如在 shared_ptr<T>
的实现中.
此外,您不必在 C++ 中将 new 与类一起使用:
void function()
{
MyClass myObject(1, 2, 3);
}
这将分配 myObject
在堆栈上。请注意 new
在现代 C++ 中很少使用。
此外,您可以重载 operator new
(全局或特定类)在 C++ 中,所以即使你说 new MyClass
,对象不一定在堆上分配。
关于c# - new 是否总是在 C++/C#/Java 中的堆上分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6972111/