gpt4 book ai didi

c++ - shared_ptr 如何处理到纯虚拟基类的复制?

转载 作者:行者123 更新时间:2023-12-05 03:19:38 24 4
gpt4 key购买 nike

Class B期望收到 shared_ptr<IError> 的实例.
Class A工具 IError并按值传递给 B 的构造函数.

我想了解如何处理这种情况。 shared_ptr如何作为模板类处理到 IError 的转换?

在一个简单的例子中 B收到shared_ptr<A>我假设调用了复制构造函数并且增加了引用计数器。然而自IError纯虚拟是不是正常的复制构造函数调用在这里似乎不是这种情况?

// Example program

#include <iostream>
#include <string>

class IError
{
public:
virtual ~IError(){};
virtual void OnError() = 0;
};



class A : public IError
{
public:
A(){};
void OnError(){std::cout << "Error Occured" << std::endl;}
};

class B
{
public:
B(std::shared_ptr<IError> errorReporter): mErrorReporter(errorReporter){}
void Action(){mErrorReporter->OnError();}

private:
std::shared_ptr<IError> mErrorReporter;
};

int main()
{
auto objA = std::make_shared<A>();
auto objB = std::make_shared<B>(objA);
objB->Action();
}

最佳答案

调试时间!让我们通过使用我们作为开发人员可用的工具来了解会发生什么。

shared_ptr objA 的内存如下所示(在内存窗口中键入 &objA;它将被其地址替换):

objA

它有一个指向对象的指针 (000002172badd8e0) 和一个指向控制 block 的指针。

控制 block 看起来像这样(将第二个值复制并粘贴到新的内存窗口中):

objA control block

它有一个指向分配器的指针(前两列)、引用计数 (1) 和弱引用计数(0 + 偏移量 1)。

objB 创建后,objA 的控制 block 已更改为引用计数 2:

objA control block after copy

shared_ptr objB 看起来像这样:

objB

它指向共享指针和控制 block 。

Shared pointer of objB

objB 中的共享指针指向与之前相同的对象 (000002172badd8e0),因此没有创建实际对象的拷贝。

objB的控制 block 表示objB只有1个引用计数:

objB control block

a normal copy constructor invocation seems not to be case here?

正确。没有创建对象的拷贝,正如我们可以通过调试器确认的那样。但是已经制作了 shared_ptr 的拷贝。

关于c++ - shared_ptr 如何处理到纯虚拟基类的复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73421277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com