gpt4 book ai didi

c++ - 在 C++ 中,删除对象时清除对对象的引用

转载 作者:行者123 更新时间:2023-11-30 03:48:48 26 4
gpt4 key购买 nike

假设 A 引用 B。

可能有数百万个 B 被各种不同的事物引用。

问题是:B 可以被删除,然后 A(或任何其他对象)可能指向垃圾,如果它去使用它,我们将得到一个 AccessViolation。

我认为正常的解决方案是 B 需要维护一个返回链接,以便我们可以取消引用。

是否有任何类型的智能指针可以处理这种情况?例如当 B 被删除时,它会清空对自身的引用吗?

添加示例:

class B
{
int x;
}

class A
{
public:
B* DangerousPointer;
};

假设 B 可以随时删除,B 有数百万个,可以引用 B 的东西很多。我想知道 B 是否已被删除,所以我不会访问它并遇到访问冲突。理想情况下,我不希望 B 必须跟踪所有引用它的 A,以便 A 知道在删除 B 时清空指向 B 的指针。

关于使用 weak_ptr 的另一个问题:

我们的软件目前根本不使用 weak_ptr 或 shared_ptr。我们有一个保存 smurfAttributes 列表的 smurfClass(s​​murf 命名约定)。

当一个 smurfClass 被删除时,我们也会删除所有的 smurfAttributes。许多其他不同的东西可能想要引用 smurfAttribute,但是当我们删除一个类及其所有属性时,我们偶尔会遇到问题,并且留下指向已删除的 smurfAttribute 的东西。

是否可以将 weak_ptr 分发给 smurfAttribute?

从文档中说:

weak_ptr 类模板存储对已由 shared_ptr 管理的对象的“弱引用”。

这是否意味着我不能只将 weak_ptr 传递给 smurfAttribute(因为它不是由 shared_ptr 管理的)?我不想让 smurfAttribute 保持事件状态,但我确实需要知道它是否已被删除,所以我不会尝试使用它。

最佳答案

这是一个 std::shared_ptr 是为了。当您创建 shared_ptr只要存在一个引用,内存就仍然有效。下面是一个使用共享指针的小例子:

#include <iostream>
#include <memory>

void use_shared_ptr(std::shared_ptr<int> sp)
{
std::cout << "in use_shared_ptr() count is: " << sp.use_count() << std::endl;
}

std::shared_ptr<int> function_that_returns_a_local_object()
{
auto foo = std::make_shared<int>(42);
std::cout << "just created shared_ptr. count is: " << foo.use_count() << std::endl;
use_shared_ptr(foo);
std::cout << "after use_shared_ptr(foo) count is " << foo.use_count() << std::endl;
return foo;
} // oh no. foo gets destroyed here. what is going to happen?

int main()
{
auto bar = function_that_returns_a_local_object();
std::cout << "back in main count is: " << bar.use_count() << std::endl;
}

输出:

just created shared_ptr.  count is: 1
in use_shared_ptr() count is: 2
after use_shared_ptr(foo) count is 1
back in main count is: 1

这样做的好处是没有手动内存管理然后什么时候完全完成 shared_ptr它会自行销毁清理分配给 make_shared 的内存

你也可以发一份 std::weak_ptr . weak_ptr允许删除底层指针,除非您调用 lock这将创建一个共享指针,该指针将延长底层指针的生命周期直到 shared_ptr。被删除。当您想给调用者一个对象但您不想给他们任何保证在他们想要使用它时它仍然存在时,您通常会使用它。 weak_ptr确实有办法检查底层指针是否被删除,它也有能力将其转换为 shared_ptr如果对象存在,您可以在使用指针时延长指针的生命周期。

编辑:

回应您在 smurfClass 中添加的问题所有的smurfAttributes将存储为 std::shared_ptr<smurfAttributes> .然后在将属性传递给其他人的函数中,您将返回 std::weak_ptr .这样属性的接收者必须尝试锁定 weak_ptr为了使用它,如果不能,那么它知道它不再具有有效属性。

关于c++ - 在 C++ 中,删除对象时清除对对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32969083/

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