我有一个功能
BOOL AltairListDialog::GetDocuments()
{
CComQIPtr<AXAPILib::ICollection> m_Collection;
HRESULT hr = m_Collection.CoCreateInstance(L"Axapi.Collection");
AXAPILib::ICollection *indices = (AXAPILib::ICollection*) m_Collection.p;
int status;
COleVariant ind;
ind.vt = VT_DISPATCH;
ind.pdispVal = (IDispatch*) indices;
return TRUE;
}
我使用了一个实现AXAPILib :: ICollection的DLL。该函数在“return TRUE”之后返回“访问冲突”;但我不知道为什么。有什么建议吗?
答案 0 :(得分:3)
好吧,钓鱼获取建议并不符合Stack Overflow的问答格式,所以投票结束这个问题并不合适。另一方面,许多其他人可能正在做同样的Bad Things™,并且可以从被告知中获益。所以:
请勿使用(AXAPILib::ICollection*) m_Collection.p
之类的C样式转换。如果在没有强制转换的情况下它没有编译,那么它只是错误。添加强制转换然后隐藏了一个错误。
在这种情况下,移除演员表的特殊情况不应有任何影响。但是在代码中有这样的演员阵容是完全没有意义的。他们不仅隐藏了错误(通过抑制警告和错误),还积极引入错误。
请勿使用(IDispatch*) indices
之类的C样式转换。如果代码没有编译而没有编译,那么它只是错误。添加强制转换然后隐藏了一个错误。
对于第二次演员表演,取下演员表可能会产生极大的影响。潜在的巨大影响是代码不再编译。在这种情况下,你知道什么是错的(尽管除了演员本身之外,这里最有可能没有错。)
不要混用智能指针和“原始”指针,除非你真的,真的真的知道你在做什么。
这里智能指针的析构函数自动Release()
从函数返回的对象。该对象是新创建的,没有其他引用。因此它的引用计数现在变为零,并且它被销毁。
在函数返回后,引用被破坏的对象是未定义的行为,很可能会产生您观察到的不良行为。
一个 CURE FOR THAT 是要求智能指针放弃对所包含的原始指针的所有权。
对于您正在使用其MSDN Library文档的特定Microsoft智能指针,您可以通过调用Detach()
成员函数来执行此操作。令人困惑的是,wrt。命名,用于C ++标准库的智能指针,作为一般约定,它通过调用release()
成员来完成。值得注意的是,Microsoft Release()
和标准库release()
是两个非常不同的操作,分别是ref count减少,呃,分离......
最后,最好不要使用Windows API的BOOL
,而是使用C ++ bool
。一个原因是为了避免代码中全部大写的灼热。更技术性的原因是bool
只有两个有效值,即false
和true
,而BOOL
有许多不同的有效值,当一个新手程序员写expression() == TRUE
之类的东西,可能会导致错误。