c# - new 是否总是在 C++/C#/Java 中的堆上分配

标签 c# java c++ memory memory-management

我的理解一直是,无论是 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/

相关文章:

c# - 如何使用 Windows 身份验证防止重复的 HTTP 请求

c++ - 意外地能够从基类ctor调用派生类虚函数

java - 使用 Lambda 和 forEach 在集合中查找对象并触发 boolean 值

java - JFrame 类型的 createGUI() 方法未定义

c++ - 使用natvis的循环双链表可视化

c++ - 从 VS2010 切换到 2012 或更高版本后 MFC 对话框边框填充发生变化

c# - Rhino Mocks 的新语法

c# - 为什么出现错误 "' CalendarsRequestBuilder' 不包含 'Request' “graphClient.Me.Calendars.Request().GetAsync(); 的定义;

c# - 如何在c#中获取Json值

java - 从 java 运行交互式 Dos 程序