不,你不能直接施放它們。但是,您可以創建一個既能執行這兩個操作的字符 C字符串沒有4個字節的標題。但是,中間的位是相同的,所以如果你發現自己需要兩種表示方式,則創建一個包裝類,它構造一個帶有4字節頭和空終止符的字符串,但可以將訪問者返回給BSTR部分和C字符串。
此代碼旨在作爲一個不完整的例子,我沒有編譯過!
class YetAnotherStringType //just what the world needs
{
public:
YetAnotherStringType(const char *str)
{
size_t slen = strlen(str);
allocate(slen);
set_size_dword(slen);
copy_cstr(str, slen);
}
const char *get_cstr() const
{
return &m_data[4];
}
const BSTR get_bstr() const
{
return (BSTR*)m_data;
}
void copy_cstr(const char *cstr, int size = -1)
{
if (size == -1)
size = strlen(cstr);
memcpy(&m_data[4], cstr, size + 1); //also copies first null terminator
m_data[5 + size] = 0; //add the second null terminator
}
void set_size_dword(size_t size)
{
*((unsigned int*)m_data) = size;
}
void allocate(size_t size)
{
m_data = new char[size + 6]; //enough for double terminator
}
char *m_data;
};
字符串數據不會被解釋爲長度。緊接着的字節將是。 BSTR指向長度+字符串結構的字符串部分。 – 2011-03-10 15:30:53
@本:謝謝你的澄清,我不知道。我會相應地修改答案。 – Jon 2011-03-10 15:33:28