cwinthread*线程指针怎么销毁结束_程序员不建议代码中使用指针,这是为什么?...

568a4220425fe28df6432464b5a7e237.gif

尽量避免在大多数代码中使用指针实现。

使用现代C ++,您几乎不需要传递指针,可以依赖引用,并且编译器本身可以进行优化以避免不必要的复制和自动转移所有权。但不总是。

d7a0e65c6a71f7bd83931c6a94d4f35a.png

智能指针的用例仍然存在。如果必须动态创建对象并将其返回到调用堆栈,则希望它们在超出范围时释放自己。如果找不到确定的位置来删除对象,或者无法确定要删除该对象的对象,那么智能指针是一个很好的解决方案。

unique_ptr的一些优点是:

您知道您的smart_ptr将持续存在,直到不再位于任何范围内,并且没有函数或类会意外地将其销毁。

整个代码路径中指向的对象将只有一个销毁。

unique_ptr并不是一个真正的指针,它的行为就像一个透明的指针,将调用转发到它所连接的对象。它不能“悬挂”并且不能为空。

unique_ptr的开销几乎与原始指针相同,即几乎没有。没有使用原始指针的加速。

shared_ptr用于由多个线程,对象等共享(更震惊!)的资源。它们在时间和内存上的使用比unique_ptr昂贵,但是它们解决了在使用对象的函数结束时保持活动对象的难题。他们为我们提供了一个参考计数器和原子访问。在垃圾回收语言中,引用计数由运行时线程保留,但C ++ shared_ptr保留其引用计数。在大多数程序中,shared_ptr的用例少于unique_ptr。

b2343ace7b8cbe34d88712dc7135ea85.png

如何避免使用智能指针泄漏:

通常,他们为您完成工作,但有几件事:

1.创建对象后,立即将其分配给指针。

Object * myobject = new Object(“ pi”,3.14159);

unique_ptr op(myobject);

std :: cout getname()<< std:endl;

2. 仅使用smart_pointer,不要再使用原始指针。

std :: cout getname()<< std:endl; //坏

//永远不要在原始指针上调用delete。

3.仅在unique_ptr内部访问该对象以复制该对象。

您不能复制unique_ptr。如果需要复制对象,

则应使用unique_ptr :: get()和new一起将副本分配

给另一个unique_ptr。

unique_ptr o2(* op); //简短,但错误。

unique_ptr o2(new Object(* op)); // 对

4.将unique_ptrs作为unique_ptrs传递给函数,或者取消引用它们并将它们作为const引用传递。

2428810cf2873e2be8517e8eaa5c5ffe.png

5.如果函数必须拥有unique_ptr的所有权,则将其移入函数。

893ce3a824c4664cd9c5e198d9655b4f.png

6. shared_ptr可以使用赋值()复制,a = b但不要将a重新分配给另一个shared_ptr,否则引用计数将减少。如果达到0,它将自行删除。

d8765fc8124e66ab5977d53e89ec9d14.png

7.不要尝试从静态分配的对象中创建unique_ptr或shared_ptr。编译器可能会让您在编译时无法使用它,但是当静态分配的对象自行销毁并且智能指针随后尝试删除它时,它将导致内存错误。仅用于动态分配的对象!

43e59927361184b68413a28f414b68a0.png

8.不要new与。(C ++ 14)一起使用std::make_unique。它代替new来进行内存分配。

c74af29d0bb81530c24665224a1896a3.png

452a4496f845020a7e598a21bcf835e4.gif

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值