gpt4 book ai didi

c++ - 理解 C++ 共享指针

转载 作者:太空狗 更新时间:2023-10-29 20:22:38 25 4
gpt4 key购买 nike

你好,我正在制作我自己的引用计数智能指针,但在我开始之前,有两个我不太明白的概念。

  1. 我知道,当创建一个共享指针指向一个对象时,我必须为一个结构/类分配内存,该结构/类将包含引用计数(最初是一个)等信息,可能还有一个用于递增的互斥锁和递减。当我使用 =operator 使另一个共享指针也指向这个对象时,我还将指向这个结构/类的指针传递给那个新指针,这样我就可以增加计数。我的问题是,如果我让第三个共享指针指向这个对象(不使用复制构造函数或 =operator),那么这个指针将不知道该结构,因此如果我删除,则引用计数为 1指针,计数将达到 0 并且该对象将被销毁,而实际上该对象还有另外两个指针?

  2. 如果共享指针的引用计数为 1,然后创建多个线程,如果一个线程结束/销毁它,其他可能仍在运行的线程会发生什么?

    <

最佳答案

I get that when a shared pointer is created to point to an object I must allocate memory for a struct/class that will contain information such as the reference count (initially one) and maybe a mutex as well for incrementing and decrementing.

是的,你需要一个计数器。
只有在计划多线程时才需要互斥体。我会集中精力让计数工作,首先担心锁定后记。

When I use, say the =operator to make another shared pointer also point to this object, I will also pass the pointer to this struct/class to that new pointer so I can increment the count.

关于共享指针的要点是它们拥有指针的所有权。创建共享指针后,不应有指向同一对象的 RAW 指针的实例。因此,当您复制或分配时,都是通过共享指针完成的。

My question is, if I make a third shared pointer point to this object(not using the copy constructor or =operator), then this pointer won't know about the struct and therefore will have a reference count of 1.

你的假设是正确的。这就是为什么在创建共享指针时不应保留指针拷贝的原因。这是引入 std::make_shared() 的另一个原因,它分配内存并立即将其包装在智能指针中,因此不会将 RAW 指针返回给用户代码。

if I then delete the pointer, the count will reach 0 and the object will be destroyed when in fact, there are two other pointers for this object?

这正是问题所在。这就是为什么您不应创建或传递指向已被管理的对象的 RAW 指针。

If a shared pointer has a reference count of 1, and then multiple threads are created, if one thread ends/destroys it, what happens with the other threads that may still be running?

如果您的引用计数正常,并且您只有共享指针管理 RAW 指针,它应该会按预期工作。但是如果你在一个线程中删除它,它会在所有线程中被销毁。

关于c++ - 理解 C++ 共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37119845/

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