加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 确保指针未被删除

发布时间:2020-12-16 10:26:48 所属栏目:百科 来源:网络整理
导读:我偶然发现了一些我无法弄清楚的东西,所以我想我在大C画面中遗漏了一些东西. 简而言之,我的问题是:如何在类中保留一个可变的,不可删除的,可能是NULL的对象实例. 较长的版本是: 我有以下场景:一堆类(我可以稍微改变,但不彻底重构),其中大多数需要使用一个
我偶然发现了一些我无法弄清楚的东西,所以我想我在大C画面中遗漏了一些东西.

简而言之,我的问题是:如何在类中保留一个可变的,不可删除的,可能是NULL的对象实例.

较长的版本是:

我有以下场景:一堆类(我可以稍微改变,但不彻底重构),其中大多数需要使用一个对象.此对象虽然可变,但由其他人管理,因此不能删除它.

这一类中的一些类不需要这样的对象 – 它们重用来自其他类的代码,但是通过提供给这些类的可用参数,即使提供了对象,也不会使用它.

当前实现使用指针到const对象(const Obj *).反过来,这意味着所有对象的方法必须是const,并且大多数字段都是可变的.这是一个混乱的解决方案,因为声明可变的字段可用于检查(因此与c lite条目here完全相反).它也只是部分地解决了“do-not-delete-this-here”问题(编译器没有抱怨,但是对象前面的const是一个指示).

如果我使用了对这个对象的引用,我会强制一些调用者创建一个“虚拟”对象并将它提供给它们实例化的类.这也是一种混乱,除了浪费资源.由于项目限制,我无法创建一个可以代表“NULL”引用的全局对象.

我觉得引用是我需要的工具,但是我无法重构所涉及的类,以至于让对象从它们未被使用的实现中消失(它可以完成,但它并不简单,它会不快#).所以我想实现一些更简单的东西,如果有人试图滥用这个对象,只会画一个警报信号,但保持我的对象可变.

我能想到的最好的解决方案是使用const-pointer-to-object(Obj * const) – 这不会让编译器抱怨,但是我有可变对象和一种警报信号 – 通过const – in地方也是.

有没有人有更好的主意?

解决方法

我传统上看到使用shared_ptr / weak_ptr组合实现这些场景.见 here.

所有者/删除者会得到一个

boost::shared_ptr<T>

你的班级会得到一个

boost::weak_ptr<T>

要重新分配弱ptr,只需重新分配指针:

void MyClass::Reassign(boost::weak_ptr<T> tPtr)
{
    m_tPtr = tPtr;
}

要使用弱ptr,首先检查它是否仍然存在:

void MyClass::Use()
{
    boost::shared_ptr<T> m_temporarySharedPtr = m_tPtr.lock();
    if (m_temporarySharedPtr)
    {
        //...
    }
}

可以通过重置弱ptr或将其分配给空的shared_ptr来使弱ptr成为“NULL”

void MyClass::MakeNull()
{
    m_tPtr.reset();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读