当前位置: 首页 > news >正文

函数指针指针函数 智能指针

简单介绍

函数指针顾名思义是一个指针,这个指针指向一个函数。

返回类型 (*指针变量名)(参数类型列表)

#include <iostream>void sayHello() {std::cout << "Hello\n";
}int add(int a, int b) {return a + b;
}int main() {void (*func1)() = sayHello;int (*func2)(int, int) = add;func1();  // 调用 sayHellostd::cout << func2(3, 4) << std::endl;  // 调用 addreturn 0;
}

指针函数 是 一个函数, 这个函数的返回值是一个指针。

#include <stdio.h>// 定义一个返回 int 指针的函数
int* getPointer() {static int x = 100;return &x;
}int main() {int* ptr = getPointer();printf("%d\n", *ptr);  // 输出 100return 0;
}

在函数中动态创建/管理数据,然后把指针返回给调用者。
在这里插入图片描述

智能指针

智能指针(smart pointer)是 C++ 中非常重要的内容,尤其是从 C++11 开始引入的现代 C++ 编程思想中。它主要解决 内存自动释放、避免内存泄漏 的问题,是 C++ 面试、实际开发中的高频点。

✅ 常见类型(C++11 引入):

类型说明
std::unique_ptr<T>独占所有权,不可复制,只能移动
std::shared_ptr<T>共享所有权,引用计数
std::weak_ptr<T>弱引用,用于解决循环引用问题

为什么普通指针容易导致内存泄漏?

cpp
复制编辑
int* p = new int(10);
// 使用 p ...
// 忘记 delete p; 就内存泄漏了!

✅ 你得手动做两件事:

  1. new 分配内存
  2. delete 释放内存

如果你忘了第 2 步,或者程序中途异常退出了,那块内存就再也没机会释放了——这就是内存泄漏


📉 什么是内存泄漏?

程序运行期间分配的内存,在不再需要时未能释放,导致系统内存被一直占用。

🚨 常见内存泄漏原因:

  • 忘记 delete
  • delete 逻辑复杂,出错时提前 return
  • 异常没捕获,程序跳过 delete
  • 多个指针指向同一块内存,被重复释放或根本没释放

✅ 用智能指针就不用担心这个了

例子:用 unique_ptr 自动管理内存

cpp
复制编辑
#include <memory>
#include <iostream>void test() {std::unique_ptr<int> p = std::make_unique<int>(42);std::cout << *p << std::endl;// 离开作用域时,p 自动 delete,安全!
}
  • 无需手动 delete
  • 出现异常也会释放
  • 不会 double delete,也不会忘记 delete

🎯 总结:智能指针的意义

用法内存管理安全性推荐使用
裸指针 int*手动管理易泄漏不推荐除非特殊场景
unique_ptr自动释放安全推荐用于独占资源
shared_ptr引用计数安全推荐用于共享资源
weak_ptr弱引用安全用于防止循环引用
要是真正在做嵌入式项目或用 C++ 开发,只要涉及到动态内存,一定要考虑用智能指针替代裸指针。
http://www.dtcms.com/a/274163.html

相关文章:

  • 通过ETL工具,高效完成达梦数据库数据同步至数仓Oracle的具体实现
  • MDSE模型驱动的软件工程和敏捷开发相结合的案例
  • Django 视图(View)
  • 指令重排序带来的多线程问题与volatile解决方案
  • Linux设备树(dts/dtsi/dtb、设备树概念,设备树解析,驱动匹配)
  • P1204 [USACO1.2] 挤牛奶Milking Cows
  • 如何设置直播间的观看门槛,让直播间安全有效地运行?
  • 云原生周刊:镜像兼容性
  • 假日流量红利:如何用ASO策略抢占季节性下载高峰?
  • 不同质押周期对代币价格稳定性的具体影响及数据支撑
  • MinIO文件存储服务工具详细使用指南
  • 和服腰封改造:3种解构主义造型的东方美学新解
  • 2025年亚太中文赛赛题浅析-助攻快速选题
  • 【氮化镓】100 V GaN晶体管在关态应力下的双退化
  • Spring Boot中请求参数读取方式
  • HTTP 请求方法详解:GET、POST、PUT、DELETE 等
  • Python中类静态方法:@classmethod/@staticmethod详解和实战示例
  • LeetCode 278. 第一个错误的版本
  • 基于生产者消费者模型的线程池【Linux操作系统】
  • mysql中的自增ID
  • 物联网-ESP8266
  • API、MCP Client、MCP Server、LLM之间的业务逻辑关系
  • 医疗预约系统中的录音与图片上传功能实现:Vue3+Uniapp 实战
  • 在线重装 Proxmox VE
  • Swift中SwiftyJSON使用详情
  • 墙裂推荐!McpStore库三行代码为Agent添加MCP能力
  • 业务建模如何让金融数字化转型 “轻” 装上
  • CentOS7环境安装包部署并配置MySQL5.7
  • 什么是proxy
  • 使用浏览器inspect调试wx小程序