我想为托管字符串使用共享指针,但我无法弄清楚语法。要创建共享指针,我需要一个分配器来调用Marshal::StringToHGlobalAnsi(managedString)
。要释放指针,自定义deletor应调用Marshal::FreeHGlobal
。我正在寻找类似的东西:
std::shared_ptr<IntPtr> managedFilename(Marshal::StringToHGlobalAnsi(videoFilename),
Marshal::FreeHGlobal); // does not compile
编译器对videoFilename
参数和IntPtr
到无效转换造成阻塞。
我在常规C中工作;但是,我想使用STL。
答案 0 :(得分:0)
您希望实现什么结果?
如果要在非托管代码中使用该字符串,则必须编写类似
的内容void MarshalString ( String ^ s, std::string& os ) {
using namespace Runtime::InteropServices;
const char* chars =
(const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
如果您正在编写托管代码,请直接使用String ^类型。
shared_ptr不适用于托管类型
<强> UPD 强> 你可以这样做,但为什么呢?
static void MyFreeHGlobal(void * ptr)
{
using namespace Runtime::InteropServices;
Marshal::FreeHGlobal(System::IntPtr(ptr));
}
// ...
System::String ^ s = L"test";
using namespace Runtime::InteropServices;
boost::shared_ptr<void> managedFilename(Marshal::StringToHGlobalAnsi(s).ToPointer(),
&MyFreeHGlobal);