稍微麻烦一点的指针

函数指针:
(函数指针就是指向函数的一个指针,它是一个指针,指向一个函数)
  type (*prr1)(type1,type2);    //函数指针的形式
(type为函数返回值的类型,type1,type2为函数形参的类型)
1:函数指针的调用:
     方法: &+函数名   或    直接函数名
2:  函数指针的数组
    例如:char* (*pf[3])(int a,int b);
   (pf是一个数组,它能存储3个返回值为char *类型,且两个形参都为int类型的函数指针)
   函数指针数组的调用:
#include <stdio.h>
#include <string.h>
char * fun1(char * p)
{
	printf("%s\n", p);
	return p;
}
char * fun2(char * p)
{
	printf("%s\n", p);
	return p;
}
char * fun3(char * p)
{
	printf("%s\n", p);
	return p;
}
int main()
{
	char * (*pf[3])(char * p);
	pf[0] = fun1; //可以直接用函数名
	pf[1] = &fun2; //可以用函数名加上取地址符
	pf[2] = &fun3;
	pf[0]("fun1");
	pf[1]("fun2");
	pf[2]("fun3");
	return 0;
}



3:函数指针数组的指针:
     char * (*(*pf)[3])(char * p);
 理解:   char*  (*)(char *p) ((*pf)[3]))
 (pf是一个指针,它指向含有3个元素的数组,数组中元素的类型为函数指针类型,函数的形参为char*,返回值为char* 类型)
//#include <stdio.h>
//#include <string.h>
//
//char * fun1(char * p)
//{
//	printf("%s\n", p);
//	return p;
//}
//
//char * fun2(char * p)
//{
//	printf("%s\n", p);
//	return p;
//}
//
//char * fun3(char * p)
//{
//	printf("%s\n", p);
//	return p;
//}
//
//int main()
//{
//	char * (*a[3])(char * p);          //函数指针数组     
//	char * (*(*pf)[3])(char * p);     //函数指针数组的指针
//	pf = &a;                          //将整个函数指针数组的地址传给函数指针数组的指针
//	a[0] = fun1;
//	a[1] = &fun2;                     //将函数地址存储在函数指针数组当中
//	a[2] = &fun3; 
//	pf[0][0]("fun1");                 //*(*(pf+0)+0)
//	pf[0][1]("fun2");                 
//	pf[0][2]("fun3");
//	return 0;
//}


<think>嗯,用户问的是用智能指针会不会更好一点,但没有给出具体的代码或场景。首先,我需要确认用户可能在使用裸指针时遇到了问题,比如内存泄漏或者资源管理麻烦。然后,我应该解释智能指针的基本概念,比如RAII,自动释放内存,避免内存泄漏。 接下来,应该分点说明几种常见的智能指针:unique_ptr、shared_ptr、weak_ptr,各自的特点和适用场景。比如unique_ptr用于独占所有权,不能复制但可以移动;shared_ptr用于共享所有权,引用计数;weak_ptr解决循环引用的问题。 然后要考虑用户可能的疑问,比如性能开销。需要提到引用计数的开销,但在大多数情况下可以接受。同时,提醒不要滥用shared_ptr,避免循环引用导致内存泄漏,这时候就需要weak_ptr。 还要举例说明使用智能指针的好处,比如代码更简洁,异常安全,避免忘记delete的情况。可能用户之前遇到过这类问题,所以对比裸指针和智能指针的代码示例会有帮助。 另外,可能需要提到C++11引入的智能指针,确保用户使用的是支持C++11或更高版本的编译器。如果有动态数组的情况,建议使用unique_ptr的数组特化版本,比如unique_ptr<int[]>。 最后,总结适用场景,强调智能指针在资源管理中的优势,同时指出在极低层或需要手动优化的情况下可能仍需裸指针。但大多数情况下,智能指针是更安全、更现代的选择。</think>智能指针是现代C++中重要的资源管理工具,合理使用可以显著提升代码质量和安全性。以下分步骤分析其优势及注意事项: 1. **内存泄漏防护** - 传统指针问题:手动`new/delete`易导致忘记释放或重复释放 ```cpp // 传统方式 MyClass* obj = new MyClass(); if(error_occurred) return; // 可能泄漏 delete obj; ``` - 智能指针方案:离开作用域自动释放 ```cpp std::unique_ptr<MyClass> obj = std::make_unique<MyClass>(); if(error_occurred) return; // 自动释放 ``` 2. **所有权明确化** - `unique_ptr`:独占所有权(C++11起) ```cpp auto p = std::make_unique<int>(42); // 唯一持有 // auto p2 = p; // 编译错误,禁止复制 ``` - `shared_ptr`:共享所有权(引用计数) ```cpp auto sp1 = std::make_shared<MyResource>(); auto sp2 = sp1; // 引用计数+1 ``` - `weak_ptr`:观察而不持有(配合shared_ptr使用) ```cpp std::weak_ptr<MyResource> wp = sp1; ``` 3. **异常安全性保障** ```cpp void process() { Resource* res = new Resource(); do_something(); // 若此处抛出异常... delete res; // 此句不会执行 } ``` vs ```cpp void safe_process() { auto res = std::make_unique<Resource>(); do_something(); // 异常时仍会释放资源 } ``` 4. **性能考量** - `unique_ptr`几乎无额外开销(等同裸指针) - `shared_ptr`有引用计数开销(原子操作) - 推荐使用`make_shared`/`make_unique`:更高效且异常安全 5. **典型使用场景** - 类成员资源管理 ```cpp class Document { std::unique_ptr<FileHandler> file; std::shared_ptr<Logger> logger; }; ``` - 工厂模式返回对象 ```cpp std::unique_ptr<Shape> create_shape(ShapeType type) { switch(type) { case Circle: return std::make_unique<Circle>(); case Rect: return std::make_unique<Rectangle>();
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值