临时的一生

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

从 C# 调用 C++ 库(不在我的控制范围内)时,我遇到一些零星的崩溃。

C++库的内部代码大致是这样的:

#include <string>
#include <memory>

class Holder {
    public:
    static std::shared_ptr<Holder> create() {
        return std::make_shared<Holder>();
    }

    const std::string& getRef() {
        return value;
    }

    private:
    std::string value;
};

extern "C" void getRef(std::string& v) {
    auto h = Holder::create();
    v = h->getRef();
}

getRef
从 C# 通过 P/invoke 调用,无需特殊编组。

这保证有效吗?

h
getRef
末尾超出范围,但对其成员
value
的引用被保留并传递。在 C# 端访问时该引用仍然有效吗?

c++ pinvoke
1个回答
0
投票

没关系。

v = h->getRef();

getRef
返回对字符串的引用,该引用在
h
被杀死(发生在函数末尾)之前一直有效。但是,该字符串已被复制到
v
字符串中。

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