0

我想对托管字符串使用共享指针,但我无法弄清楚语法。要创建共享指针,我需要一个分配器来调用Marshal::StringToHGlobalAnsi(managedString). 要释放指针,自定义删除器应调用Marshal::FreeHGlobal. 我正在寻找类似的东西:

std::shared_ptr<IntPtr> managedFilename(Marshal::StringToHGlobalAnsi(videoFilename), 
    Marshal::FreeHGlobal);  // does not compile

编译器正在阻塞videoFilename参数和IntPtr-to-void 转换。

我有这个在传统的 C 中工作;但是,我想使用 STL。

4

1 回答 1

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); 
于 2012-10-20T19:35:09.080 回答