C++学习笔记 10 new_Instance 堆栈选择

Java 程序员习惯new,但C++不一样

一个最大的问题是,我看到每个来自托管语言比如Java或C#的人,他们会在C++中到处使用new关键字
但在C++中你不应该这样做,有2个原因。后面谈及。
简单来说就是因为性能的原因。在堆上分配要比在栈上分配花费更长的时间。
而且在堆上分配内存的话,那你必须要手动去释放被分配的内存。

如何选择堆栈呢?

1.如果你的对象非常大,或者你想显示的控制对象生命周期,就在堆上创建
2.如果不是这2种情况,就在栈上分配,这更简单,会自动回收,也更快。
3. 在堆上分配,就需要手动delete,如果你忘了delete,这会导致内存泄漏。
4. 你也可以使用智能指针,实际上仍然可以在 堆上进行分配,而且仍然可以获得那种大小的优势。
还有就是当指针超出作用域时,对象会被自动删除。
或者是那种共享指针,当没有指向它的引用时,也会被自动删除。
5. 如果可以,首选使用栈分配

#include<iostream>
#include<string>

using String = std::string;

class Entity {
private:
	String m_Name;
public:
	Entity() : m_Name("Unknown") {}
	Entity(String name) : m_Name(name) {}
public:
	const String& getName() const { return m_Name; }
};

//一个最大的问题是,我看到每个来自托管语言比如Java或C#的人,他们会在C++中到处使用new关键字
//但在C++中你不应该这样做,有2个原因。后面谈及。
//简单来说就是因为性能的原因。在堆上分配要比在栈上分配花费更长的时间。
//而且在堆上分配内存的话,那你必须要手动去释放被分配的内存。	

//如何选择堆栈呢?
//1.如果你的对象非常大,或者你想显示的控制对象生命周期,就在堆上创建
//2.如果不是这2种情况,就在栈上分配,这更简单,会自动回收,也更快。
//3. 在堆上分配,就需要手动delete,如果你忘了delete,这会导致内存泄漏。
//4. 你也可以使用智能指针,实际上仍然可以在 堆上进行分配,而且仍然可以获得那种大小的优势。
//   还有就是当指针超出作用域时,对象会被自动删除。
//   或者是那种共享指针,当没有指向它的引用时,也会被自动删除。
//5. 如果可以,首选使用栈分配
void Create_Instance() {
	
	//1.栈创建,本方法执行完了,栈中此对象就没了,释放了
	//  栈空间小,最多也就大概2M,3M
	Entity e0("Hello");
	Entity entity = Entity("小超");

	//2.堆创建,本方法执行完了,此对象依然在堆中,需要手动释放删除
	//  不删除的话也可以再本方法外引用到
	Entity* entity = new Entity("小超");

	std::cout << entity.getName() << std::endl;
}


int main() {
	Create_Instance();

	std::cin.get();
}
posted @ 2025-12-11 10:13  超轶绝尘  阅读(1)  评论(0)    收藏  举报