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();
}

浙公网安备 33010602011771号