如何在C ++中删除BSTR类型的变量

时间:2012-11-02 07:27:47

标签: c++ visual-studio-2010 bstr

下面的代码是我的结构和包含结构引用的类。

typedef struct MESSAGE
{
    int MessageType;
     BSTR Name;
    _bstr_t TimeStampIs;
} MESSAGE, *PMESSAGE;

typedef struct MESSAGENODE
{
    PMESSAGE Message;
    MESSAGENODE* pNext;
} MESSAGENODE, *PMESSAGENODE;


class Message
{
private:
    PMESSAGENODE        MessageQueueFront;
    PMESSAGENODE        MessageQueueBack;
public:
    bool AddMessageToQueue(PMESSAGE Message);
    void DeleteMessageQueue(void){
    PMESSAGE pMess;
    while((pMess = GetMachineMessage()) != NULL)
    {
        if((pMess->DialysisDataIs))
        SysFreeString(pMess->Name.Detach());
        delete pMess;
}
}m;

int main()
{
PMESSAGE Message;
    Message = new MESSAGE;
    Message->Name=L"ABC";
    Message->TimeStampIs=L"25252";
    m.AddMessageToQueue(Message);
    m.DeleteMessageQueue();
    return 0;
}
  

当我编译上面的代码时,我收到以下错误   DeleteMessageQueue函数

     

错误C2451:类型'_bstr_t'的条件表达式是非法错误   C2228:'.Detach'的左边必须有class / struct / union

3 个答案:

答案 0 :(得分:3)

一些事情,首先是错误的结果

SysFreeString(pMess->Name.Detach());

Message::Name是一个原始的BSTR指针,我保证你没有名为Detach()的成员函数。但是,_bstr_t类确实如此。将结构更改为:

typedef struct MESSAGE
{
    int MessageType;
    _bstr_t Name;
    _bstr_t TimeStampIs;
} MESSAGE, *PMESSAGE;

完成后,您可以完全删除SysFreeString()调用,因为现在Name和TimeStampI都是智能指针,并且会在对象销毁时自动释放。

答案 1 :(得分:2)

喜欢这个

SysFreeString(pMess->Name);

但是没有充分的理由在这样的代码中使用BSTR。编写自己的链表类也没有任何合理的理由。这样做很简单(正如塞尔比指出这不是代码中唯一的错误),我建议std::wstringstd::list

#include <string>
#include <list>

struct MESSAGE
{
    int MessageType;
    std::wstring Name;
    std::wstring TimeStampIs;
};

class Message
{
private:
    std::list<MESSAGE> queue;
public:
    ...
};

最大的好处是你不必delete任何东西。所以这些问题都会消失。

答案 2 :(得分:0)

更改此行:

SysFreeString(pMess->Name.Detach());

对此:

SysFreeString(pMess->Name);
pMess->Name = NULL;

但那不是你唯一的问题......

此外,这条线是错误的:

Message->Name=L"ABC";

您正在为BSTR分配WCHAR *。对于所有意图和目的而言,只有在您通过SysFreeString发布它之前,它才能正常工作。 (这可能会崩溃。)

按如下方式分配字符串:

pMess->Name = SysAllocString("ABC");

_bstr_t是一个有用的字符串类,内部持有BSTR。在转换为/从本机WCHAR *字符串转换时,它会处理所有SysAllocString / SysFreeString调用。所以将它用于Name是有意义的,就像你在TimeStampIs中使用它一样。