boost::any ÔÚ¿çÄ£¿éʹÓÃʱ£¬ÄѵÀÓÐBUG£¿
boost::any ÔÚ¿çÄ£¿éʹÓÃʱ£¬ÄѵÀÓÐBUG£¿ÔÚÎÒµÄÒ»¸öDLLÀÓÐÒ»¸öÀàÈçÏ£º
class MyClass
{
...
boost::any m_var;
}
ÔÚDLL±»×°ÔصÄʱºò»ánew Ò»¸öMyClass(±ÈÈçpMyClass), Ð¶ÔØDLLʱ»á delete µôËü¡£
ÁíÍâDLLÓÐÒ»¸ö½Ó¿Ú£¬ÈçÏ£º
void SetVar(boost::any & anyValue)
{
pMyClass->m_var = anyValue;
}
ÔËÐÐЧ¹û£º
µ±³ÌÐòÍ˳ö£¬Ð¶ÔØDLL£¬delete pMyClassʱ»á³ö´í¡£´íÎóµÄµØµãÊÇboost::anyµÄÎö¹¹º¯Êý£¬ÈçÏ£º
...
class any
{
...
~any()
{
delete content; // ³ö´í£¬0xC0000005´íÎó¡£
}
...
}
...
ÎÒʹÓÃanyʱ£¬Ã»Ê¹ÓÃÈÎÎñÖ¸Õ룬ËùÒÔBOOSTÓ¦¸ÃÒªÎÒÃDZ£Ö¤²»»á³öÏÖÎÊÌâ¡£µ«È´»á³öÈËÒâÁϵÄÔÚBOOSTÄڵĴúÂëÀï³öÏÖ´íÎó£¬ÕæÊDz»Ã÷°×¡£´ó¼ÒÓÐûÓÐÓöµ½ÕâÖÖÇé¿öµÄ£¿
ÎҵĻ·¾³£º
windows 2000 pro sp4
vc6 sp5
boost 1.31 boostÊÇûÓÐ벡µÄ£¬¹Ø¼üÊÇwindowsÄÚ²¿µÄ벡¡£ÒòΪdllºÍexe¶¼ÊÇwindowsÄÚ²¿µÄmodule£¬Ä¬ÈÏÊÇÒ»¸ömodule¶ÔÓ¦Ò»¸öheap£¨ÄÚ´æ¶Ñ£©¡£
¿´
void SetVar(boost::any & anyValue)
{
pMyClass->m_var = anyValue;
}
anyµÄ operator=ÀïÃæÓÐnew²Ù×÷£¬¿´£¬Óõ½ÁËheapÁË
µ«ÊÇÔÚÎö¹¹µÄʱºòÊÇÔÚdllµÄheapÀïÃæ£¬ÄÇÖ¸Õë²»³ö벡²Å¹ÖÄÇ
½â¾ö°ì·¨
¿ÉÒÔÖØÔØclass holderµÄ new ºÍdelete ²Ù×÷·û£¬ÈÃËûÖ´Ðе½Í³Ò»µÄ¶ÑÀïÃæ¡£void* operator new(size_t sz)
{
return ::HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz);
}
void operator delete (void* pz,size_t sz)
{
::HeapFree(GetProcessHeap(),HEAP_ZERO_MEMORY,pz);
}
µ±È»£¬ÄãÒ²¿ÉÒÔ×Ô¼ºÐ´Ò»¸ömemory pool»òÕßÓÃboost×Ô¼ºµÄ¡£
Ò³:
[1]