从 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# 端访问时该引用仍然有效吗?
没关系。
v = h->getRef();
getRef
返回对字符串的引用,该引用在 h
被杀死(发生在函数末尾)之前一直有效。但是,该字符串已被复制到 v
字符串中。