求助vector析构弹框的问题
c++吧
全部回复
仅看楼主
level 12
jiaon 楼主
各位大神:
我的编译器是vs2010,debug版没问题,release版经常弹框,有时候也不弹。加log看是在一个函数里面,通过一个dll导出类的对象得到一个vector,用完以后出函数体时候弹的框。
相关代码:
struct RectInBalloonElemnet_t
{
RECT rect;
long nProperty;
};
void Player::DrawFire(DWORD dwCurrentTime)
{
vector<RectInBalloonElemnet_t> rectBalloon;
m_pLgSprite->GetHitRect(rectBalloon);
......
//过了这弹框
}
dll里面的这个get:
void BaseLogicSprite::GetHitRect( vector<RectInBalloonElemnet_t>& rect )
{
if (m_vecHitRect.size()!=0){
rect.assign(m_vecHitRect.begin(),m_vecHitRect.end());
}
}
看stack是从我的程序调到msvcr100!78ab016a 再到ntdll!7c91082c ,然后就ntdll!7c9109f9 0xc0000005 access violation了.
这个vector哪用错了吗?其它地方类似的用法也弹过框...
2013年04月19日 01点04分 1
level 8
其他地方的问题导致的吧
2013年04月19日 05点04分 2
void Player::DrawFire(DWORD dwCurrentTime) { vector<RectInBalloonElemnet_t> rectBalloon; m_pLgSprite->GetHitRect(rectBalloon); } 就剩这两句了,还是会弹
2013年04月19日 06点04分
level 1
在使用STL时,DLL和程序之间不能通过容器来传递数据,更多请参考这里:http://wwywnp.blog.163.com/blog/static/16372208720110260455308/
建议通过回调函数,或者其他函数实现数据共享。
2013年04月19日 06点04分 4
果然是这个问题,把这个改了就好了
2013年04月22日 06点04分
thank you very much
2013年04月22日 06点04分
level 12
jiaon 楼主
PlayerLg是BaseLogicSprite 的子类。m_pLgSprite是个基类指针指向子类对象。
BaseLogicSprite *m_pLgSprite;
m_pLgSprite是new出来的
BaseLogicSprite* BaseLogicGameMap::CreatePlayer(
const Static_Element_InMap_t& stStaticElements,
const CharacterProperty_t& st,bool bCycleMap)
{
PlayerLg *pLgSprite=new PlayerLg(fGravity,m_nWidth,m_nHeight,st,bCycleMap);
if (!pLgSprite){
return NULL;
}
......
pLgSprite->SetPos(pos);
m_listLgSprites.push_back(pLgSprite);
m_vecPlayerLgSprite.push_back(pLgSprite);
return pLgSprite;
}
然后把m_pLgSprite设给player:
bool GameMap::CreatePlayers(LPDIRECT3DDEVICE9 pd3dDevice,//in
const list<Static_Element_InMap_t>& listStaticElements,//in
bool bCycleMap)
{
list<Static_Element_InMap_t>::const_iterator itSE=listStaticElements.begin();
for (;itSE!=listStaticElements.end();itSE++)
{
BaseLogicSprite* pLgSprite=m_pLgMap->CreatePlayer(*itSE,
DataController::m_ch[0].stProperty,bCycleMap); //display sprite
Player *pSprite=new Player(pd3dDevice,DataController::m_ch[0].PlayerComposedIdx,itSE->nLayer,bCycleMap);
if (pLgSprite)
{
pSprite->SetLgSprite(pLgSprite);
}
#ifdef TEST_SFP
pSprite->SetString("player");
#endif
m_vecSprites.push_back(pSprite);
}
return true;
}
m_vecHitRect是在PlayerLg的构造函数里赋的值,是一些常量
vector<RectInBalloonElemnet_t> m_vecHitRect;
PlayerLg::PlayerLg(......)
{
......
if (m_bCycle){
m_vecHitRect.resize(6);
ZeroOtherSideHitRect();
}else{
m_vecHitRect.resize(3);
}
//0 balloon,1 body,2 fire
m_vecHitRect[1].rect.left=posPlayerCenterOffset.x-NBodyWidth/2;
m_vecHitRect[1].rect.top=posPlayerCenterOffset.y-NBodyHeight/2;
m_vecHitRect[1].rect.right=NBodyWidth+m_vecHitRect[1].rect.left;
m_vecHitRect[1].rect.bottom=NBodyHeight+m_vecHitRect[1].rect.top;
m_vecHitRect[1].nProperty=HPStay|HPPlayer; ......
}
2013年04月19日 07点04分 5
PlayerLg *pLgSprite=new PlayerLg(fGravity,m_nWidth,m_nHeight,st,bCycleMap);[$1]if (!pLgSprite){[$1]return NULL;[$1]}这种代码是无效的
2013年04月19日 08点04分
level 12
用 c++ 风格 dll 接口属于活该。
2013年04月19日 17点04分 6
level 1
楼主活该鉴定完毕
2013年04月20日 11点04分 7
哪都有你...[拖走]
2013年04月20日 11点04分
1