gpt4 book ai didi

c++ - 智能指针 - 为什么使用它们,使用哪个?

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:37 25 4
gpt4 key购买 nike

一般问题
现在我已经阅读了很多关于智能指针的文章,共享指针在很多情况下看起来“完美”。但是我也读到了循环引用或类似的东西?哪里不能使用shared_ptr?我很难理解这一点,有人可以举一个简单的例子来说明这一点吗?

此外,我真的很想知道,weak_ptr 提供了哪些普通指针不提供的功能? - 因为他们不增加引用计数,所以不能保证他们指向的内存仍然有效?

我的个人项目:
在一个项目中,我有 2 个“全局”容器(两个容器都将很快移到一个类中),它们都充满了“对象”。但是两者都应该“指向”同一个对象。一个对象不能存在于这些容器之外,也不可能一个容器包含它而另一个容器不包含它。

目前我只是为此使用普通指针,并有一个 createObjectdestroyObject 方法来管理内存。

这是好的设计吗?我应该使用智能指针吗?

最佳答案

回答您的各种问题:

循环引用是指 2 个不同的对象各自有一个指向另一个对象的 shared_ptr。

例如:

struct Foo {
shared_ptr< Bar > m_bar;
};

struct Bar {
shared_ptr< Foo > m_foo;
};


void createObject()
{
shared_ptr< Foo > foo( new Foo );
shared_ptr< Bar > bar( new Bar );
foo->m_bar = bar;
bar->m_foo = foo;
//Neither of these objects will be released here
}

这可能导致两个对象都不被释放,因为 Foo 将始终将引用计数保持在 1 以上的 bar,而 foo 不会被释放,因为 bar 将始终将其引用计数保持在 1 以上。

这种情况可以用 weak_ptr 来克服,因为它们不会增加引用计数。正如您所指出的,这不会阻止 ptr 被释放,但确实允许您在使用它之前检查该对象是否仍然存在,这是标准指针无法做到的。

至于你提供的例子,你应该几乎总是使用智能指针而不是原始指针,因为它们允许对象在超出范围时自动释放,而不是你必须确保自己完成,这可能容易出错。在您有异常的情况下尤其如此,这很容易跳过您编写的任何发布代码。

例如,这段代码可能会导致问题:

Foo* foo = createObject();
foo.doSomething();
deleteObject( foo );

如果 foo.doSomething 是 except,那么 deleteObject 将永远不会被调用,foo 也不会被释放。

但是,这是安全的:

shared_ptr< Foo > foo = createObject();
foo.doSomething();

无论是否发生异常,shared_ptr 都会在代码块结束时自动释放。

此处对指针和智能指针进行了相当不错的讨论:Pointers, smart pointers or shared pointers?

关于c++ - 智能指针 - 为什么使用它们,使用哪个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8242320/

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