C++,为什么你应该尽可能使用unique_ptr替换裸指针*

作者: HexUp分类: 计算机技术 发布时间: 2022-11-07 09:06:54 浏览:29902 次

C++,为什么你应该尽可能使用unique_ptr替换裸指针*

牢23:
谢谢大佬,带我有个初步认识,剩下的细节和用法我会自己去探索的[打call]

whoeles:
标题认真的?其实对新手多少有点误导了。智能指针最后还是解决所有权问题。我要调用一个函数,函数参数是个指针,这个时候我需要用uniqueptr吗?有可能需要有可能不需要,只要是看函数是否拥有资源的所有权。所以“尽量用unique ptr替代裸指针”这种说法相当有误导性啊。[思考]

【回复】如果是函数传递应该用引用 而不是指针。引用比指针安全
【回复】回复 @请转多云233 : 3. 为解决2的情况通常是把unique_ptr改为shared_ptr去管理资源,返回shared_ptr对应的weak_ptr,但容易造成语义问题,语义会变为共享,不再是独有。
【回复】回复 @whoeles : 1.unique_ptr管理资源时,接口返回裸指针供调用者访问,调用者无法判断他是否要delete该裸指针,实现对应weak_ptr可以起到提案里observer_ptr的作用。2. 一样是接口返回裸指针供调用者访问时,调用者可能存在无法确认生命周期的情况,实现对应weak_ptr可以更安全。
Eivilo:
为什么很多公司,不提倡使用智能指针?

【回复】要么是公司的项目有自己的资源管理方案,比方说UE的GC,QT的对象树或者自己手搓的引用计数;要么是公司的代码还停留在C++98。前者用智能指针会导致多次析构,后者是公司垃圾。 还有一点就是把智能指针作为接口的一部分,导致的ABI兼容性问题和所谓的“智能指针扩散”,不过这属于设计失误,对于前者,要保证ABI兼容只应使用extern c来导出接口,STL容器不应该作为接口的一部分;对于后者,大多都是没能理解智能指针的“所有权”,粗暴的把代码中所有的裸指针替换为智能指针导致的,实际上,在不涉及所有权变更的时候,像函数的参数就应该使用裸指针做形参,仅在调用时,使用get传递裸指针而非直接传递智能指针。 智能指针这东西是通用的RAII式容器,非常方便,不能因噎废食。
【回复】回复 @startuan :现代qt中使用智能指针当然没问题,但是qt本身有另外一套内存管理,名为qObject,当这几种内存管理混合在一起的时候,就很大可能会出现问题。 当然,你也可以用裸指针来用智能指针的对象,但是“可以”并不代表这容易读容易懂,更不代表代码重用性会增加。
呃啊www:
每次一有两个圆圆的东西你就更新了哈哈哈[脱单doge]

账号已注销:
up,能不能讲讲unique_ptr和shared_ptr的实际应用场景,什么时候才是独占一个内存的情况?

【回复】当你搞得懂变量的所有权和生命周期时用unique pointer,搞不懂时用shared pointer。 换言之,用脑力开销换性能开销。
【回复】一般,默认优先使用unique_ptr,当你发现uniqueptr无法解决你的问题的时候再用共享指针。比方说,有一个矩阵类,使用场景要求每个实例的数据只能自己使用修改,那么底下的数据应当使用uniqueptr。如果有一个类叫Student,他有个成员变量是学校,多个学生可以指向同一个学校,这时候用sharedptr。大致是这样,根据实际使用情况做判断。
LOVE_PEACE1999:
```cpp Ball* ball = up.release(); delete ball; ball = nullptr; ``` 你可以用release()把unique_ptr跟资源解绑,release()返回资源的裸指针,同时把unique_ptr设置成nullptr,此时你需要手动管理内存。 如果你把一个unique_ptr赋值为nullptr,也会释放底下的资源 > 疑惑:这里ball从一个裸指针释放赋给了一个裸指针,那第3行应该说是把裸指针ball设置成nullptr吧

90后的一介书生:
https://www.bilibili.com/video/BV1KG4y187qf?t=163.4 打错了吧,应该是up.get();

马斯克的表弟:
unique_ptr 不能叫0开销,因为编译生成的二进制也是一种空间开销

malennia:
up的素材是来自C++20高级编程吗 我正好刚看的书上这一块没看懂来看你的视频才看懂了怎么用[打call]

不懂A和B栈的我:
up 有个小问题 make_unique创建的对象是在堆上还是栈上?

B4night_:
unique ptr,shared ptr和weak ptr哪一个用的更多

【回复】一般前两个比weak ptr多一些
某公主链接福瑞的小号:
智能指针不是万能的,我需要传递,就不能用独占指针,还是裸指针好用[吃瓜]

Micmeter:
库的导出函数里可以使用这种指针吗?会不会出现不同版本编译器对其内存布局定义不同导致出现问题?

王宽的小景:
大数据给我一个SQL刚入门三天的人推c++,是不是太看得起我了

编程语言 内存泄漏 指针 C/C++ c++

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!