下面的代码是我的结构和包含结构引用的类。
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
答案 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::wstring
和std::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中使用它一样。