智能指针
发布网友
发布时间:2023-05-17 05:08
我来回答
共1个回答
热心网友
时间:2023-09-12 07:11
智能指针可以解决悬挂指针的问题。
一 效率
shared_ptr 有一个引用计数变量 int m_count; 但在多线程下面赋值是线程安全的,应该是有个countMutex,但是对里面的指针对象操作肯定不是线程安全的,需要程序自己保证。
所以效率上使用unique_ptr 更高一些,类似原生指针。 可以用move()移交对象,保持独立性。
#include <memory>
unique_ptr<MyClass> pMyClass(new MyClass());
std::unique_ptr<int> pTest = std::make_unique<int>(3);
使用make_shared构造共享指针。效率更高,原理见参考2。
shared_ptr<MyClass> pMyClass= make_shared<MyClass>("huang");
二 内存泄漏
class A {
public:
shared_ptr<B> m_b;
};
class B {
public:
shared_ptr<A> m_a;
};
{
shared_ptr<A> pa(new A()); 对象A引用计数为1
shared_ptr<B> pb(new B()); 对象B引用计数为1
pa -> m_b= pb; 对象B引用计数为2
pb -> m_a = pa; 对象A引用计数为2
}
pa 释放 对象A引用计数为1, pb 释放 对象B引用计数为1, 由于对象A, B没有释放,那么引用计数就不会被减1. 永远不会释放。
解决方案:
1 设计上我们感觉A要用智能指针包裹,那么他的成员就不允许有智能指针对象。 c++这方面的问题太多,我们应该多有这些设计原则。
2 shared_ptr成员改为 weak_ptr,weak_ptr不会添加引用计数。其实就没有意义了。很容易出现空指针异常。还不如直接指针。
说明:
1 unique_ptr 对象移动拷贝的时候会释放自身的包裹对象,然后拷贝移动的对象。不会造成内存问题。
参考:
1 https://zhuanlan.hu.com/p/101938827
2 https://blog.csdn.net/suwanworld/article/details/103940013
指针有哪些类型的
智能指针: 是C++中为了处理原生指针可能引发的问题而引入的一种安全指针。智能指针在申请内存时自动管理内存,当智能指针离开作用域时会自动释放内存,有效避免了原生指针可能导致的内存泄漏问题。常见的智能指针类型包括std::unique_ptr、std::shared_ptr和std::weak_ptr等。指针数组与数组指针: 指针数组...
智能指针可以自动释放内存吗
是的,智能指针可以自动释放内存。智能指针是一种特殊的指针,它会在对象不再被引用时自动释放其分配的内存。智能指针的这种特性可以避免内存泄漏和悬挂指针等问题,使得代码更加健壮和可靠。在使用智能指针时,程序员不需要手动释放内存,只需要在声明时指定其类型即可。我们可以利用类中编译器自动调用其构造...
shared_ptr作用
shared_ptr是一种特殊的智能指针,其设计类似于普通指针,但它具有独特的引用计数功能。每当有一个shared_ptr指向某个对象时,该对象的引用计数就会增加。当引用计数变为0,意味着没有shared_ptr再指向该对象,此时,系统会自动删除这个对象,从而避免了非环形数据结构中常见的资源泄露问题。相比之下,传统...
c++智能指针用法
智能指针是 c++中有四个智能指针: auto_ptr、shared_ptr、weak_ptr、unique_ptr ,其中后三个是c++11支持,并且第一个已经被c++11弃用。 智能指针是一个 RAII(Resource Acquisition is initialization) 类模型,用来动态的分配内存。当超出类的作用域时,类会自动调用析构函数,析构函数会自动释...
探索android的强指针实现
强指针和弱指针基础Android中的智能指针包括:轻量级指针、强指针、弱指针。强指针:它主要是通过强引用计数来进行维护对象的生命周期。弱指针:它主要是通过弱引用计数来进行维护所指向对象的生命周期。如果在一个类中使用了强指针或者弱指针的技术,那么这个类就必须从RefBase这个类进行做继承,因为强指针和...
C++|深入理解智能指针
智能指针是一个类类型,它乔装打扮成一个指针,但额外提供了内建指针所无法提供的能力。通常而言,一个智能指针通过使用类的构造函数、析构函数和复制操作符所提供的能力,来控制(或跟踪)对它所指向的东西的访问,而内建指针在这方面则无能为力。所有智能指针都重载 -> 和* 操作符,从而可以采用...
Windows句柄是什么东西?
1、句柄为一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。2、整个Windows编程的基础,一个句柄指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个...
android智能指针介绍
轻量级指针在Android中是由LightRefBase来提供的,看下内容:一个类只要继承LightRefBase,然后配合sp就可以使用智能指针的功能了。sp后面会单独介绍。从这儿可以看出来,轻量级指针主要是在类里面添加了一个原子变量作为计数变量,然后通过incStrong和decStrong来实现计数的增减。这儿有一个细节是这个计数可能会在...
c++11智能指针(一) shared_ptr
智能指针是存储动态分配对象指针的类,用于生命周期的控制。当指针离开其作用域时,自动销毁动态分配的空间,防止内存泄漏。使用智能指针需要包含头文件#include<memory> std::shared_ptr采用引用计数,每一个shared_ptr的拷贝都指向相同的内容,当最后一个shared_ptr析构的时候,内存被释放 当使用shared_ptr...
智能指针原理
实现原理:采用引用计数器的方法,允许多个智能指针指向同一个对象,每当多一个指针指向该对象时,指向该对象的所有智能指针内部的引用计数加1,每当减少一个智能指针指向对象时,引用计数会减1,当计数为0的时候会自动的释放动态分配的资源。1) 智能指针将一个计数器与类指向的对象相关联,引用计数器跟踪...