如何创建托管字符串的共享指针?

时间:2012-10-20 18:27:03

标签: c++ stl visual-studio-2012

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

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

编译器对videoFilename参数和IntPtr到无效转换造成阻塞。

我在常规C中工作;但是,我想使用STL。

1 个答案:

答案 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);