不,你不能直接施放它们。但是,您可以创建一个既能执行这两个操作的字符 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