各位,前几天我尝试运行之前师兄的一个程序(基于opencascade做的一个虚拟装配程序),发现在运行过程中opencascade的一个库文件<Handle_Standard_Transient.hxx>时出现错误: 0xC0000005: 读取位置 0x0000000000000050 时发生访问冲突。头文件代码如下。报错位置为Handle(Standard_Transient) (const Handle(Standard_Transient)& aTid)
class Handle(Standard_Transient)
{
public:
// Public methods
//! Empty constructor
Handle(Standard_Transient) ()
: entity(0)
{
}
//! Constructor from pointer to new object指向新对象指针的构造函数
Handle(Standard_Transient) (const Standard_Transient anItem)
: entity ( (Standard_Transient)anItem )
{
BeginScope();
}
//! Copy constructor拷贝构造函数
** Handle(Standard_Transient) (const Handle(Standard_Transient)& aTid)
: entity ( aTid.entity )
{
BeginScope();
} **
//! Destructor
~Handle(Standard_Transient)()
{
EndScope();
}
//! Assignment operator
Handle(Standard_Transient)& operator=(const Handle(Standard_Transient)& aHandle)
{
Assign(aHandle.Access());
return *this;
}
//! Assignment operator
Handle(Standard_Transient)& operator=(const Standard_Transient* anItem)
{
Assign(anItem);
return *this;
}
//! Nullify the handle
void Nullify()
{
EndScope();
}
//! Check for being null
Standard_Boolean IsNull() const
{
return entity == 0;
}
//! Returns pointer to referred object
Standard_Transient* Access()
{
return entity;
}
//! Returns const pointer to referred object
const Standard_Transient* Access() const
{
return entity;
}
//! Cast to pointer to referred object
operator Standard_Transient*()
{
return entity;
}
//! Cast to const pointer to referred object
operator const Standard_Transient*() const
{
return entity;
}
//! Member access operator (note non-const)
Standard_Transient* operator->() const
{
return entity;
}
//! Dereferencing operator
Standard_Transient& operator*()
{
return *entity;
}
//! Const dereferencing operator
const Standard_Transient& operator*() const
{
return *entity;
}
//! Check for equality
int operator==(const Handle(Standard_Transient)& right) const
{
return entity == right.entity;
}
//! Check for equality
int operator==(const Standard_Transient *right) const
{
return entity == right;
}
//! Check for equality
friend bool operator==(const Standard_Transient *left, const Handle(Standard_Transient)& right)
{
return left == right.entity;
}
//! Check for inequality
bool operator!=(const Handle(Standard_Transient)& right) const
{
return entity != right.entity;
}
//! Check for inequality
bool operator!=(const Standard_Transient *right) const
{
return entity != right;
}
//! Check for inequality
friend bool operator!=(const Standard_Transient *left, const Handle(Standard_Transient)& right)
{
return left != right.entity;
}
//! Down casting operator; dummy provided for consistency with other classes
//! (descendants)
static const Handle(Standard_Transient)& DownCast(const Handle(Standard_Transient)& AnObject)
{
return AnObject;
}
//! Dump pointer to a referred object to a stream
Standard_EXPORT void Dump(Standard_OStream& out) const;
protected:
// Protected methods for descendants
//! Returns non-const pointer to referred object
Standard_Transient* ControlAccess() const
{
return entity;
}
//! Assignment
Standard_EXPORT void Assign (const Standard_Transient *anItem);
private:
// Private methods
//! Increment reference counter of referred object
Standard_EXPORT void BeginScope();
//! Decrement reference counter and if 0, destroy referred object
Standard_EXPORT void EndScope();
public:
DEFINE_STANDARD_ALLOC
private:
// Field
Standard_Transient *entity;
};
//! Function in global scope to check handles for equality.函数在全局范围内检查句柄是否相等。
//! Will be used with standard OCCT collections like NCollection_DataMap within NCollection_DefaultHasher当没有为具体类型定义特化时,将与
//! when there are no specialization defined for concrete type. NCollection_DefaultHasher中的标准OCCT集合一起使用,如NCollection_DataMap。
//! Notice that this implementation compares only pointers to objects!注意,这个实现只比较指针和对象!
inline Standard_Boolean IsEqual (const Handle(Standard_Transient)& theFirst,
const Handle(Standard_Transient)& theSecond)
{
return theFirst == theSecond;
}
#ifdef _WIN32
#pragma warning (pop)
#endif
#endif