:m_pResource(pResource) , m_pCounter(new Count er())
m_pCount er~>shareCount - 1;
SharedPtr (const WeakPtr
(other. m_pResource)
, m_pCounter(other? m_pCounter) [
if (0 -- m_pCounter\
SharedPtr(const SharedPtr
:m_pResource (other\, m_pCounter(other\[
■H-(m_pCounter->shareCount); // 増加引用计数
SharedPtr
if (this == Mother) return this; release ();
m_pCounter = other? m_pC ounter; m_pResource = other. m_pResource; ++(m_pCounter->shareCount); // 増加引用计数
x
return *this; }
\I
release ();
T& operator bool () [
return m_pResource != nullpir;
// 如果nullptr == m_pResource,抛出异常 return *m_pResource;
}
T& operator * ()
T* operator -> () [
return m_pResource; } private:
void release () [
// T*肯定由 SharedPtr 释放,Count er*如果没有 WeakPtr,也由 SharedPtr 释放 --m_pCount er~>shareCount; if (0 == m_pCount er~>shareCount) [
delete m_pResource; m_pResource - nullptr; if (0 == m_pCount er~>weakCount) [
delete m_pCounter; m_pCounter = NULL;
public:
T* m_pResource = nullptr; Counter* m_pCounter - nullptr;
WeakPtr类
主要的成员函数包括: 默认构造函数
参数为SharedPh&的explicit单参数构造函数 拷贝构造函数 拷贝赋值函数 析构函数
lock。函数:取指向的SharePtr,如果未指向任何ShazePtr,或者已被析构,返回指 向 nullptr 的 SharePtr
expired ()?数:是否指向SharePtr,如果指向Share Ptr其是否已经析构 release ()? 数 WeakPtr实现如下:
template
friend class SharedPtr
m_pResource(nullptr)
, m_pCount er (new Count er ()) [
m_pCount er^weakCount = 1; }
WeakPtr(SharedPtr
:m_pResource(other. m_pResource) ,m_pCount er (other. m_pCounter) [
++(m_pCounter->weakCount);
-
}
WeakPtr(WeakPtr
:m_pResource(other. m_pResource) , m_pCounter(other. m_pCounter) {
++(m_pC ount erwe akC ount); }
WeakPtr
if (this == &other) return this; release ();
m_pCounter = other. m_pCount er; m_pResource = other. m_pResource; ++m_pCount er^weakCount; return *this; release ();
WeakPtr
-x
-
m_pCounter = other? m_pCounter; m_pResource - other. m_pCount er;
+-hn_pCount er->weakCount; // 増加弱引用计数 return *this; }
WeakPtr () [
release ();
}
SharedPtr
return SharedPtr
}
bool expired () [
if (m_pCounter != nullptr && m_pCountershareCount != 0) return false; return true; } private:
void release() {
--m_pCount er\
if (0 == m_pCourrt er->weakCount && 0 == m_pCount er->shareCount) // 必 须都为0
才能删除
{
delete m_pCounter; m_pCounter = NULL;
private:
T* m_pResource; //可能会成为悬挂指针 Counter* m_pCounter;
35.请问C++11有哪些新特性?
c卄11最常用的新特性如下:
aut。关键字:编译器可以根据初始值自动推导出类型。但是不能用于函数传参以及数 组类
型的推导
nullptr关键字:mllptr是一种特殊类型的字面值,它可以被转换成任意其它的指针 类型;
而NULL-般被宏定义为0,在谒到重载时可能会出现问题。
智能指针:C++11新増了 std: :shared_p-rk std: : weak_ptr等类型的智能指针,用于 解决内存管理的问题。
初始化列表:使用初始化列表来对类进行初始化
右值引用:基于右值引用可以实现移动语义和完美转发,消除两个对象交互时不必要的 对象拷贝,节省运算存储资源,提高效率
atomic原子操作用于多线程资源互斥操作
新増STL容器array以及tuple
36. 智能指针是线程安全的吗?哪些地方需要考虑线程安
全?
1. 智能指针对象中引用计数是多个智能指针对象共享的,两个线程中智能指针的引用计
数同时卄或者一,这个操作不是原子的,引用计数原来是1,卄了两次,可能还是2, 这样引用计数就乱了,有可能造成资源粹放或者程序崩溃的风险。所以说智能指针中 I或一的操作是需要加锁的,也就是说引用计数的操作是线程安全的
2. 智能指针的对象存放在堆上,两个线程同时去访问,就会造成线程安全问题. std:: shaxed_ptr 循环引用 struct ListNode {
int _data;
shared_ptr shared_ptr r 〈 -P^ev; ListNode, _next; listNodeO { cout ? ); int \:)\
2020年京东精选50面试题及答案



