(转)老板不让用shared_ptr,会是什么原因?

shared_ptr基本没有用处。

//例1
class A {
int *p; //成员变量
A(){
p = new int();
}
~A() {
delete p;
}
}

int main() {
A *a = new A(); //局部变量
//一些操作
delete a;
}
在例1中,谁都知道变量在哪new,在哪delete,使用shared_ptr的唯一作用是防止忘记delete。然而在实际项目中,用的开发环境基本都会有成熟的内存检测机制,不会因此而出问题。//例2
class Window {
Button *b;
}
class Button {
Window *w;
}
在例2中,如果你使用shared_ptr,就要付出比用raw pointer更多的思考。到底谁该weak谁不该?这时候你即便用了智能指针,也要在脑子里过一遍对象delete的顺序。这很智能。//例3.1 一个树节点结构如下
struct TreeNode {
TreeNode *parent;
TreeNode *chiled;
TreeNode *sibling;
}
//例3.2 一个双向循环链表只有两个节点,满足如下关系
p->next = q;
q->next = p;
p->prev = q;
q->prev = p;
//例3.3
class Man {
Woman *wife;
}
class Woman {
man husband;
}
//例3.4 最简单的单链表
struct Node
{
shared_ptr<Node
> next;
DataType data;
}
例3.1中,或许你还可以仿照例2用weak,但是在3.2中,shared_ptr已经完全无法使用了。在例3.3中,引用关系看似简单,实则难以处理,让哪一个weak都无法抵挡zhihu♀quan大军。实际开发中,对象间的引用关系只会比这更加复杂。在例3.4中,看似没问题,实际运行则可能递归过深爆栈。综合例1-3,可以看到,shared_ptr最多让你不会忘了delete,而你如果自己都不知道在哪delete,shared_ptr完全无法帮你,甚至会极大增加你的思考量。接下来看看异常和多线程两个重灾区。//例4
void fun() {
int *p = new int;
{
//一些会抛出异常的操作,并且你打算在外面处理
}
delete p;//可能会内存泄漏
}
以上情况,似乎需要使用shared_ptr。然而这不过是RAII的使用场景,仅仅使用unique_ptr或者手写RAII完全足够应对。你问p想传出怎么办?用release脱离unique_ptr后在外面使用裸指针,转化为例1-3的情况。//例5,平台相关线程创建
int CreateThread(int(fun)(void), void param);
Windows和Linux平台的线程创建函数均如例5所示。通常线程传入参数的生存周期一定是比创建线程的scope要大,可以选择全局的,或者new出来的。这时候new出来的使用shared_ptr可以极大降低管理复杂度。然而,这种情况shared_ptr几乎无法使用,因为你很难将shared_ptr转化程void
再在线程里面转回去,同时保证引用计数不出错。如果你使用全局的,如下//例6 为什么多线程读写 shared_ptr 要加锁?陈硕说明了对同一个shared_ptr多线程读写会有 race condition,shared_ptr并不完全线程安全。并且我认为,这种全局的指针用shared_ptr是没有必要的,用unique_ptr保证引用计数为1足够了。//例7
void thread_fun(shared_ptr i){
//线程操作
}
//不一定在主线程里面,可能创建完线程后这个函数就返回了
void create_thread(){
shared_ptr i = make_shared();
std::thread t1(thread_fun, i);
std::thread t2(thread_fun, i);
t1.join();//join和detach无所谓
t2.detach();
}
例7是我能想到唯一可以发挥shared_ptr,又只能用它无法替代的地方。然而你让你们老板把代码都改成这样,你给他出钱发工资?

作者:知乎用户
链接:https://www.zhihu.com/question/33084543/answer/162153267
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值