1、智能指针有没有内存泄露的情况?
答:当两个对象同时使用一个shared_ptr
成员变量的指向对方,会造成循环引用,使引用计数失效,从而导致内存泄露。
2、智能指针的内存泄漏如何解决?
答:为了解决循环引用导致的内存泄漏,引入了弱指针weak_ptr
,weak_ptr
的构造函数不会修改引用计数的值,从而不会对对象的内存进行管理,其类似一个普通指针,但是不会指向引用计数的共享内存,但是可以检测到所管理的对象是否已经被释放,从而避免非法访问。
3、shared_ptr
实现过程(计数器原理)
#ifndef __SHARED_PTR_H__
#define __SHARED_PTR_H__
using namespace std;
template<typename T>
struct Data{
T* m_ptr;
int m_count;
};
template<typename T>
class shared_ptr{
Data<T>* m_data;
public:
shared_ptr(T* ptr = NULL){
m_data = new Data<T>;
m_data->m_ptr = ptr;
m_data->m_count++;
}
shared_ptr(shared_ptr& p){
m_data = p.m_data;
m_data->m_count++;
}
shared_ptr& operator=(const shared_ptr& p){
if(&p != this && m_data != p.m_data){
m_data->count--;
if(0 == m_data->m_count){
delete m_data->m_ptr;
delete m_data;
m_data == NULL;
}
m_data = p.m_data;
m_data->m_count++;
}
return *this;
}
~shared_ptr(){
m_data->m_count--;
if(0 == m_data->m_count){
delete m_data->m_ptr;
delete m_data;
m_data == NULL;
}
}
T& operator*()const{return *(m_data->m_ptr);}
T* operator->()const{return m_data->m_ptr;}
};