函数指针指针函数 智能指针
简单介绍
函数指针顾名思义是一个指针,这个指针指向一个函数。
返回类型 (*指针变量名)(参数类型列表)
#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; 就内存泄漏了!
✅ 你得手动做两件事:
new
分配内存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++ 开发,只要涉及到动态内存,一定要考虑用智能指针替代裸指针。 |