一个有关VC中managed code和unmanage code传递参数的问题
以前在做.neet开发的时候一直在用C#,最近开始转移到VC/clr上,开发时突然意识到一个不大不小的疑点:
代码如下:
[code=c/c++]
//Form COM的Event代码,使用的是Managed Code
private: System::Void textBox2_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
if(e->KeyChar == 13)
{
if(this->textBox2->Text->Length)
{
entryPtr->SendAsyncMessage(this->textBox2->Text);
this->textBoxSending->AppendText(this->textBox2->Text);
this->textBoxSending->AppendText("\n");
this->textBox2->Clear();
}
}
}
//Unmanaged部分的代码,将System::String转换成wchar_t数组
int CommModelBase::SendAsyncMessage(System::String^ s)
{
int len = s->Length + 1;
wchar_t* str = new wchar_t[len];
memset(str,0,len*sizeof(wchar_t));
for(int i=0;i<s->Length;i++)
{
str[i] = s[i];
}
//blabla其他代码
return 0;
}
[/code]
这段代码在使用中一切OKAY,但是有一个问题我一直没有想明白:
众所周知C#中类似的代码是完全通过引用进行传递的,但是在C++中传递给函数的参数需要用&来修饰引用传递。虽然System::String属于Managed部分,但是我很好奇在这个传递过程中:
1. 这个传递过来的参数是引用参数还是复制了一个新的实例
2. 假如是引用传递,我在什么地方将容器Lock()比较好;假如是值传递,那么由于gcnew的缘故,我是否可以像C#一样完全不考虑delete[]的问题?
求赐教