gpt4 book ai didi

c++ - gcroot 的这种用法安全吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:54 24 4
gpt4 key购买 nike

我需要使用来自 C++/CLI 的非托管 API。此 API 存储指向任意用户数据的空指针和一些回调。然后它最终调用这些回调,将用户数据作为 void* 传递。

到目前为止,我有一个 native 类将其“this”指针作为用户数据传递,并使用该指针将 API 调用返回到此类中,即:

static void __stdcall Callback(void* userData) {
((MyType*)userData)->Method();
}

class MyType {
public:
MyType() { RegisterWithApi((void*)this, Callback); }
void Method();
};

我正在尝试使用托管类来翻译它。我发现 gcroot 类型可用于在 native 代码中安全地存储托管引用,所以我现在是这样做的:

// This is called by the native API
static void __stdcall Callback(void* userData) {
// Cast back to gcroot and call into managed code
(*(gcroot<MyType^>*)userData)->Method();
}

ref class MyType {
gcroot<MyType^>* m_self;
public:
MyType() {
m_self = new gcroot<MyType^>;
RegisterWithApi((void*)m_self, Callback);
}
~MyType() { delete m_self; }
// Method we want called by the native API
void Method();
}

虽然这对 C++/CLI 编译器来说似乎没问题,但我并不能完全放心。据我了解,gcroot 在 GC 移动时以某种方式跟踪其托管引用。它会在非托管代码存储为 void* 时设法做到这一点吗?这段代码安全吗?

谢谢。

最佳答案

这就是我最终所做的,而且效果很好。 gcroot 的目的是在 native 堆上存储托管引用,这正是我在这里所做的。

关于c++ - gcroot 的这种用法安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com