惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
L
LangChain Blog
美团技术团队
N
Netflix TechBlog - Medium
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
博客园 - 司徒正美
爱范儿
爱范儿
D
DataBreaches.Net
月光博客
月光博客
U
Unit 42
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
MongoDB | Blog
MongoDB | Blog
腾讯CDC

博客园 - 左直拳

在centos上部署gitea服务器 我的2025 利用wvp-gb28181-pro国标级联实现上级观看下级摄像头 将c++程序部署到docker 安装linux时的存储设置 使用Mobile Atlas Creator 2.0获取离线地图 利用SRS拉取摄像头辅码流实现浏览器展示多路摄像头预览功能 自签名证书需要手动确认风险导致nginx转发无效问题 程序跑在docker容器里会有性能瓶颈吗? 前端vue3+后端spring boot导出数据 c++程序示例:多线程下的实例计数器 linux下变更mysql的数据文件目录 c++项目使用drogon框架提供Resful API在CPU ARM架构下崩溃问题 编写c++程序分别在x86和arm架构的ubuntu下访问CAN 接口设备 时区问题导致java程序查询无结果 ubuntu 20.04挂载固态硬盘 项目绩效域 c++中“&”符号代表引用还是取内存地址? 高级项目管理
c++中构造对象实例的两种方式及其返回值
左直拳 · 2025-05-09 · via 博客园 - 左直拳

c++中,构造对象实例有两种方式,一种返回对象实例,一种返回该对象实例的指针。如下所示:

一、两种返回值

RedisConn conn1; //得到实例conn1;

RedisConn *conn2 = new RedisConn();//得到指针conn2;

RedisConn conn3 = new RedisConn();//错误,类型不匹配

意思是说,RedisConn conn;就是构造了一个实例,而通过new方式的话,就是返回指针。太奇怪了,跟c#、java完全不一样啊。在c#或java中,RedisConn conn意味着conn没有赋值,new RedisConn()返回一个诚实可靠的实例。

二、后续两种不同的处理方式

1、构造于栈

RedisConn conn;

这种方式下,conn 是在栈(stack)上分配的。栈是由编译器自动管理的内存区域,用于存储局部变量。conn 的生命周期与它的作用域相关联。当程序执行离开定义 conn 的代码块时(比如函数结束),conn 会被自动销毁,其析构函数会自动调用。

这种方式的话,如果想访问它的成员函数和成员变量,通过"."号,比如conn.rec_cnt;

void function() {
    RedisConn conn; // 在栈上创建一个 RedisConn 实例
    conn.someMethod(); // 直接调用方法
} // 当函数结束时,conn 自动被销毁

优点:
自动管理内存,无需手动释放。
简单易用,适合于局部使用的小型对象。

缺点:
栈上的空间有限,不适合创建大型对象或需要长时间存在的对象。
对象的生命周期受限于其作用域。

2、构造于堆

RedisConn* conn = new RedisConn();

内存分配:new RedisConn() 在堆(heap)上为 RedisConn 对象分配内存,并返回指向该对象的指针。
生命周期:堆上的对象不会随着作用域的结束而自动销毁。你需要显式地调用 delete 来释放这块内存,否则会导致内存泄漏。
访问方式:通过 -> 操作符来访问指针所指向的对象的成员函数和成员变量。

void function() {
    RedisConn* conn = new RedisConn(); // 在堆上创建一个 RedisConn 实例
    conn->someMethod(); // 使用 -> 操作符调用方法

    // 记得释放内存
    delete conn;
    conn = nullptr; // 设置为 nullptr 避免悬挂指针
}

优点:
可以动态控制对象的生命周期,适合于需要长时间存在或大小不确定的对象。
堆上的空间相对较大,适合创建大型对象。

缺点:
需要手动管理内存,增加了出错的可能性(如忘记释放内存导致内存泄漏)。
分配和释放堆上的内存通常比栈上的操作更慢。

三、堆和栈

1、栈(Stack)

后进先出。

2、堆(Heap)

特殊的完全二叉树结构,存进去,自然而然得到一个位置,比如它的子节点都比它小,形成一个小山包(小土堆);或者反过来,它所有儿子都比它大。所以堆查找最大值最为快速。有最大堆,最小堆。没有好大堆。

二叉树的概念我已经忘得一干二净,依稀记得有一种二叉树是:

左边的子节点都比它小,右边的子节点都比它大

这种跟堆没有啥关系,这叫二叉搜索树,排过序的,便于搜索。

与堆相对应,可能是坨,完全没有顺序可言。