从shared_ptr获取原始指针,将其传递给需要原始的函数

问题描述 投票:5回答:1

首先,我对C ++还是很陌生,所以如果我的理解很差,我深表歉意。我会尽力解释自己。我所拥有的是我使用的是一个返回std::shared_ptr<SomeObject>的库函数,然后我有一个采用原始指针参数的库函数(更具体地说,是node-addon-api Napi::External<T>::New(Napi::Env env, T *data)静态函数)。我想使用我的std :: shared_ptr创建一个Napi::External对象。我当前正在执行的操作是:

{
    // ...
    std::shared_ptr<SomeObject> pSomeObject = something.CreateSomeObject();
    auto ext = Napi::External<SomeObject>::New(info.Env(), pSomeObject.get());
    auto instance = MyNapiObjectWrapper::Create({ ext });
    return instance;
}

但是我担心这会遇到内存问题。我的pSomeObject仅存在于当前作用域中,因此我想应该在返回之后发生,它的引用计数将下降为0,并且它指向的SomeObject实例将被销毁,因此我返回的实例将出现问题使用此对象。但是我已经能够从我的实例上运行此代码并在SomeObject上调用函数,因此我认为我的理解可能是错误的。

我的问题是,给定共享指针时应该怎么办,但由于其他第三方库要求,我需要处理原始指针?向我建议的一个选择是对对象进行深层复制并创建指向该对象的指针。

如果我对这方面的理解是错误的,请纠正我,因为我说过我对C ++很陌生。

============================

编辑:

[因此,我从原始帖子信息中丢失了有关所有权及其确切含义的信息。该块是用于Napi::ObjectWrap实例的实现的实例方法。该实例方法需要返回一个Napi::Object,它可用于node.js中的调用方。我正在使用Napi::External,因为我需要在创建返回的Napi::Value时将New的子类型传递给构造函数Napi:Object函数,并且我需要在提取的外部包装好的SomeObject对象我的MyNapiObjectWrapper构造函数如下:

class MyNapiObjectWrapper
{
private:
    SomeObject* someObject;
    static Napi::FunctionReference constructor; // ignore for now
public:
    static void Init(Napi::Env env) {...}
    MyNapiObjectWrapper(const CallbackInfo& info)
    {
        Napi::Env env = info.Env();
        Napi::HandleScope scope(env);

        // My original code to match the above example
        this->someObject = info[0].As<const Napi::External<SomeObject>>().Data();
    }

    DoSomething()
    {
        this->someObject->DoSomething();
    }
}

此后我意识到我可以在创建外部对象时传递共享指针的地址,并按如下方式使用它]]

// modified first sample
{{
    // ...
    std::shared_ptr<SomeObject> pSomeObject = something.CreateSomeObject();
    auto ext = Napi::External<SomeObject>::New(info.Env(), &pSomeObject);
    auto instance = MyNapiObjectWrapper::Create({ ext });
    return instance;
}

// modified second sample
class MyNapiObjectWrapper
{
private:
    std::shared_ptr<SomeObject> someObject;
    static Napi::FunctionReference constructor; // ignore for now
public:
    static void Init(Napi::Env env) {...}
    MyNapiObjectWrapper(const CallbackInfo& info)
    {
        Napi::Env env = info.Env();
        Napi::HandleScope scope(env);

        // My original code to match the above example
        this->someObject = 
            *info[0].As<const Napi::External<std::shared_ptr<SomeObject>>>().Data();
    }

    DoSomething()
    {
        this->someObject->DoSomething();
    }
}

因此,现在我将一个指向shared_ptr的指针传递给它来创建我的Napi::External,现在我的问题是这样吗?就像我刚开始说的那样,我是c ++的新手,但这似乎有点难闻。但是我通过一些调试对其进行了测试,并且可以看到引用计数增加了,所以我认为我很清楚吗?

首先,我对C ++还是很陌生,所以如果我的理解很差,我深表歉意。我会尽力解释自己。我所使用的是一个库函数,该函数返回std :: shared_ptr <...>

c++ memory-management shared-ptr smart-pointers node-addon-api
1个回答
3
投票

[这里是documentation的重要部分:

Napi :: External模板类实现了使用任意C ++数据创建Napi :: Value对象的功能。 由用户负责管理任意C ++数据的内存

© www.soinside.com 2019 - 2024. All rights reserved.