EgtGeomKernel 2.2a5 :

- corretta GdbObj::CopyAttribsFrom per mancata liberazione memoria prima di nuova assegnazione
- riportata la stessa correzione in GdbObj::CopyTextureDataFrom e GdbObj::CopyUserObjFrom
- corretta GeomDB::CopyAllInfoFrom per verificare e garantire allocazione Attribs.
This commit is contained in:
Dario Sassi
2020-01-21 10:58:56 +00:00
parent 5f497c3f28
commit 8bf083146d
4 changed files with 19 additions and 27 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ class Attribs
Attribs* Clone( void) const
{ Attribs* pAttribs ;
// alloco oggetto
pAttribs = new(std::nothrow) Attribs ;
pAttribs = new( std::nothrow) Attribs ;
if ( pAttribs != nullptr)
*pAttribs = *this ;
return pAttribs ; }
BIN
View File
Binary file not shown.
+14 -24
View File
@@ -101,6 +101,10 @@ GdbObj::CopyAttribsFrom( const GdbObj* pSou)
// se l'oggetto sorgente non esiste
if ( pSou == nullptr)
return false ;
// cancello gli attributi originali
if ( m_pAttribs != nullptr)
delete m_pAttribs ;
m_pAttribs = nullptr ;
// copio gli attributi
if ( pSou->m_pAttribs != nullptr) {
m_pAttribs = pSou->m_pAttribs->Clone() ;
@@ -112,12 +116,6 @@ GdbObj::CopyAttribsFrom( const GdbObj* pSou)
// marcatura sempre disabilitata
m_pAttribs->ResetMark() ;
}
// altrimenti li cancello
else {
if ( m_pAttribs != nullptr)
delete m_pAttribs ;
m_pAttribs = nullptr ;
}
return true ;
}
@@ -129,18 +127,16 @@ GdbObj::CopyTextureDataFrom( const GdbObj* pSou)
// se l'oggetto sorgente non esiste
if ( pSou == nullptr)
return false ;
// cancello i dati di texture originali
if ( m_pTxrData != nullptr)
delete m_pTxrData ;
m_pTxrData = nullptr ;
// copio texture data
if ( pSou->m_pTxrData != nullptr) {
m_pTxrData = pSou->m_pTxrData->Clone() ;
if ( m_pTxrData == nullptr)
return false ;
}
// altrimenti li cancello
else {
if ( m_pTxrData != nullptr)
delete m_pTxrData ;
m_pTxrData = nullptr ;
}
return true ;
}
@@ -152,6 +148,10 @@ GdbObj::CopyUserObjFrom( const GdbObj* pSou)
// se l'oggetto sorgente non esiste
if ( pSou == nullptr)
return false ;
// copio UserObj originale
if ( m_pUserObj != nullptr)
delete m_pUserObj ;
m_pUserObj = nullptr ;
// copio UserObj
if ( pSou->m_pUserObj != nullptr) {
m_pUserObj = pSou->m_pUserObj->Clone() ;
@@ -159,12 +159,6 @@ GdbObj::CopyUserObjFrom( const GdbObj* pSou)
return false ;
m_pUserObj->SetOwner( m_nId, m_pGDB) ;
}
// altrimenti lo cancello
else {
if ( m_pUserObj != nullptr)
delete m_pUserObj ;
m_pUserObj = nullptr ;
}
return true ;
}
@@ -367,12 +361,8 @@ GdbObj::LoadAttribs( NgeReader& ngeIn)
Attribs*
GdbObj::GetSafeAttribs( void)
{
if ( m_pAttribs == nullptr) {
Attribs* pAttribs = new( nothrow) Attribs ;
if ( pAttribs == nullptr)
return nullptr ;
m_pAttribs = pAttribs ;
}
if ( m_pAttribs == nullptr)
m_pAttribs = new( nothrow) Attribs ;
return m_pAttribs ;
}
+4 -2
View File
@@ -2776,8 +2776,10 @@ GeomDB::CopyAllInfoFrom( int nId, int nSouId)
return false ;
// copio tutte le Info
if ( pGdbObj != pGdbObjSou && pGdbObjSou->m_pAttribs != nullptr)
return pGdbObj->m_pAttribs->CopyAllInfoFrom( *(pGdbObjSou->m_pAttribs)) ;
if ( pGdbObj != pGdbObjSou && pGdbObjSou->m_pAttribs != nullptr) {
pGdbObj->GetSafeAttribs() ;
return ( pGdbObj->m_pAttribs != nullptr && pGdbObj->m_pAttribs->CopyAllInfoFrom( *(pGdbObjSou->m_pAttribs))) ;
}
else
return true ;
}