首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止删除用作共享指针的原始指针?

如何防止删除用作共享指针的原始指针?
EN

Stack Overflow用户
提问于 2019-08-14 15:12:30
回答 2查看 1.8K关注 0票数 2

我为一个C++类实现了一个class,它使用其他对象的共享指针来访问它们。当然,在我的can中,我只能获得原始指针。因此,我将class中的原始指针“转换”为一个共享指针,然后与我的C++类方法一起使用它:

代码语言:javascript
复制
method(std::shared_ptr<dataType>(raw-pointer));

现在,我遇到的问题是,在“方法”的末尾总是调用共享指针析构函数,不幸的是,它杀死了我的原始指针所指向的对象(我不想看到这个对象)。那么,我怎样才能防止原始指针被杀死呢?

我已经试过了一些共享指针函数,比如重置()或交换(),但是它们都没有让我的原始指针离开.

代码语言:javascript
复制
bool Traffic_doStep(traffic_handle t, environment_handle e, double cycletime) {
    if (!valid(t, __FUNCTION__)) return false;
    if (!valid(e, __FUNCTION__)) return false;
    if (!valid(cycletime, __FUNCTION__)) return false;

    try {
        t->doStep(std::shared_ptr<Environment>(e), cycletime);
        return true;
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return false;
    }
}

预期的结果是,在此函数返回后,原始指针e仍然指向有效的对象。实际上,原始指针指向被删除的对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-14 15:18:05

不要将指针放在std::shared_ptr

智能指针在C++中的目的是提供自动的生命周期管理。当您编写std::shared_ptr<int> ptr{raw_ptr};时,期望当ptr超出范围时,raw_ptr指向的对象将是deleted。如果这不是目的,则不应该将指针放置在智能指针中。

因此,如果应用程序不管理指针的生存期,那么存储原始指针是完全可以接受的。

如果函数后面的API无法更改,则需要使用无op删除函数构造std::shared_ptr,以便在调用清理时,指针不会发生任何变化。

代码语言:javascript
复制
try {
    std::shared_ptr<Environment> temp_ptr{e, [](int *) {}/*No-Op Deleter*/};
    t->doStep(temp_ptr, cycletime);
    return true;
}

这将解决您的问题,但这当然是一个反模式;不要这样做,除非您已经迫于API的设计约束,您无法控制。

票数 13
EN

Stack Overflow用户

发布于 2019-08-14 15:21:31

您可以提供共享指针的自定义删除器。

下面是一个可行的构造函数:

代码语言:javascript
复制
template< class Y, class Deleter > 
shared_ptr( Y* ptr, Deleter d );

但我宁愿使用唯一的指针,然后释放它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57497517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档