new创建对象,对象保存在堆还是栈?

本文深入解析堆内存与栈内存的区别,阐述new创建对象存放于堆内存,而局部变量及对象引用则位于栈内存。通过具体实例说明两者在函数调用、变量存储等方面的应用差异。

new创建对象,对象保存在堆还是栈?

–>堆内存是用来存放由new创建的对象和数组,即动态申请的内存都存放在堆内存

–>栈内存是用来存放在函数中定义的一些基本类型的变量和对象的引用变量

例子:局部变量存放在栈;new函数和malloc函数申请的内存在堆;函数调用参数,函数返回值,函数返回地址存放在栈

堆和栈的区别

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表 ,呵呵。

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。
————————————————
版权声明:本文为优快云博主「WX_Chen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/kl1411/article/details/65959992

# 题目重述 单例模式中创建对象是在区还是在区?为什么? # 详解 在**单例模式(Singleton Pattern)**中,**对象的创建通常是在区(heap)**。 ### 原因分析: 单例模式的核心目标是**在整个程序运行期间只创建一个对象实例**,并提供全局访问点。为了满足这一需求,对象不能随着函数或作用域的结束而被销毁,因此不能使用区的局部变量来保存实例。 --- ### 单例模式的典型实现(区创建) ```cpp class Singleton { private: static Singleton* instance; // 静态指针,指向区创建的对象 // 私有构造函数,防止外部创建对象 Singleton() {} // 删除拷贝构造函数和赋值运算符(C++11及以上) Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; public: // 提供全局访问点 static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); // 在创建对象 } return instance; } ~Singleton() { cout << "析构函数调用" << endl; } }; // 初始化静态成员变量 Singleton* Singleton::instance = nullptr; ``` 在这个实现中: - `instance = new Singleton();` 表示对象是**在区动态分配**的。 - 程序结束时需手动调用 `delete instance;` 来释放内存(或通过智能指针自动管理)。 - 保证了**单例对象的生命周期贯穿整个程序运行过程**,不会因函数返回或作用域结束而销毁。 --- ### 如果使用区创建会发生什么? 如果尝试在区创建单例对象,例如: ```cpp Singleton& getInstance() { Singleton instance; // 区创建 return instance; // 返回局部变量引用,导致悬空引用 } ``` 这样做会引发**悬空引用(dangling reference)**问题,因为 `instance` 是局部变量,离开函数作用域时会被销毁,返回的引用将成为无效引用,后续使用会导致**未定义行为**。 --- ### 进阶:使用局部静态变量实现单例(C++11起线程安全) ```cpp static Singleton& getInstance() { static Singleton instance; // 静态局部变量,生命周期贯穿整个程序 return instance; } ``` 虽然这种方式的对象是**在程序的静态存储区创建**(不是也不是),但它的生命周期由程序控制,且保证**只会被初始化一次**。这是 C++11 及以上推荐的单例实现方式,**线程安全**,无需手动管理内存。 --- # 知识点(列出该答案中涉及的知识点) - **单例模式原理**:确保一个类只有一个实例,并提供全局访问点,常用于配置管理、日志系统等。 - **对象管理**:使用`new`在创建对象,手动通过`delete`释放,适用于需要长期存在的对象。 - **静态局部变量生命周期**:C++11中静态局部变量在首次执行到声明处时初始化,程序结束时自动析构,适合实现线程安全的单例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值