char* _stdcall wchar2char(const wchar_t* wchar)
{
int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
char* m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
m_char[len] = '\0';
return m_char;
}
網上的例子基本都是這樣的,我想問一下 里面用到了new 不用delete釋放的話沒有問題嗎?這段代碼本來就只能這樣嗎 還是說不完美?
uj5u.com熱心網友回復:
使用了 new,就應該在不再需要的時候采用 delete 釋放的不用的空間。uj5u.com熱心網友回復:
我貼這個函式就相當于每呼叫一次就new了一個沒有釋放哦
uj5u.com熱心網友回復:
new 可以在函式內部釋放,也可以在外部釋放,這個函式使用的要求就需要你自己在使用完成之后,自行釋放。回傳值為char * 這個方法可以保證你使用的時候回傳指標沒有問題。
如果你覺得這個不合理,可以稍做改造
int _stdcall wchar2char(const wchar_t* wchar,char * m_char)
{
int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
//char* m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
m_char[len] = '\0';
return strlen(m_char);
}
自己再加些例外處理就可以了,轉換后的指標你在外部傳入,這樣就可以誰分配誰釋放了
uj5u.com熱心網友回復:

我封裝了兩種。一種是回傳char*的 用完了delete
一種回傳string stringw 不怕記憶體問題了
uj5u.com熱心網友回復:
這樣的話dll豈不是不能用extern "C"來修飾了嗎
uj5u.com熱心網友回復:
我不用dll,我說的封裝是函式
uj5u.com熱心網友回復:
wchar_t轉char。外邊給一個wchar進來,你還一個char出去。
char你放哪呢?盛飯還得有碗。
要不讓過來盛飯的人自帶家伙,
或者你去拿一個碗盛好還回去。
你對外說你碗、飯滴管夠。
結果實際上別人吃完就給你把碗扔了。最后你發現你的碗用完了。
uj5u.com熱心網友回復:
我基本都用string和wstring替換了。在函式里面new,用完就delete。std::string_stdcall wchar2char(const wchar_t* wchar)
{
int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
char* m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
m_char[len] = '\0';
std::string str;
str = m_char;
delete []m_char;
return std::move(str);
}
uj5u.com熱心網友回復:
我基本都用string和wstring替換了。在函式里面new,用完就delete。
std::string_stdcall wchar2char(const wchar_t* wchar)
{
int len = WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), NULL, 0, NULL, NULL);
char* m_char = new char[len + 1];
WideCharToMultiByte(CP_ACP, 0, wchar, wcslen(wchar), m_char, len, NULL, NULL);
m_char[len] = '\0';
std::string str;
str = m_char;
delete []m_char;
return std::move(str);
}
寫在dll里的話回傳值是string的話就不能用 extern "C"了
uj5u.com熱心網友回復:
寫在dll里的話回傳值是string的話就不能用 extern "C"了
可以參考類似的方法嘛,比如設計個類。
class test1
{
public:
test1(){ ptr = NULL;};
~test1(){if(ptr)delete[]ptr};
void resize(int length)
{
if(ptr)delete[]ptr;
ptr = new char[length];
}
char * getData(){return ptr;}
private:
char *ptr;
}
匯出函式弄成
bool_stdcall wchar2char(const wchar_t* wchar, void *out);
呼叫的時候
test1 t;
wchar2char(L"Hello World", &t);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/20702.html
標籤:C++ 語言
