好文档 - 专业文书写作范文服务资料分享网站

2020年京东精选50面试题及答案

天下 分享 时间: 加入收藏 我要投稿 点赞

:m_pResource(pResource) , m_pCounter(new Count er())

m_pCount er~>shareCount - 1;

SharedPtr (const WeakPtr& other) // 供 WeakPtr 的 lock。使用 :m_pResource

(other. m_pResource)

, m_pCounter(other? m_pCounter) [

if (0 -- m_pCounter\

SharedPtr(const SharedPtr& o^her)

:m_pResource (other\, m_pCounter(other\[

■H-(m_pCounter->shareCount); // 増加引用计数

SharedPtr& operator = (const SharedPtr& other) [

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 class WeakPtr [ public:

friend class SharedPtr; If%便 weak_ptr 与 share_ptr 设置引用计数和赋值。 WeakPtr ()

m_pResource(nullptr)

, m_pCount er (new Count er ()) [

m_pCount er^weakCount = 1; }

WeakPtr(SharedPtr& other)

:m_pResource(other. m_pResource) ,m_pCount er (other. m_pCounter) [

++(m_pCounter->weakCount);

-

}

WeakPtr(WeakPtr& other)

:m_pResource(other. m_pResource) , m_pCounter(other. m_pCounter) {

++(m_pC ount erwe akC ount); }

WeakPtr& operator = (WeakPtr& other) [

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& operator =(SharedPtr& other)

-x

-

m_pCounter = other? m_pCounter; m_pResource - other. m_pCount er;

+-hn_pCount er->weakCount; // 増加弱引用计数 return *this; }

WeakPtr () [

release ();

}

SharedPtr lock() [

return SharedPtr(*this);

}

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 nodel(new ListNode); shared_ptr node2(new ListNode); cout ? no del. use__count () ? endl; cout ? node2. use__count () ? endl; nodel->_next = node2;

r

-P^ev;

ListNode, _next;

listNodeO { cout ? ); int \:)\

2020年京东精选50面试题及答案

:m_pResource(pResource),m_pCounter(newCounter())m_pCounter~>shareCount-1;SharedPtr(constWeakPtr&other)//供WeakPtr的lock。使用:m_pResource(other.m_pRes
推荐度:
点击下载文档文档为doc格式
8utyq5c5gu8mpoj7ocb09o8y29wtcx00z09
领取福利

微信扫码领取福利

微信扫码分享