Jump to content
  • Advertisement
Sign in to follow this  
Bruno

Works in VC6++, fails in VC2003

This topic is 4575 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi., Well, i'm porting my code from VC6 to VC2003, and i'm having some problems with it. The code compiles and links fine, but crashes in places, where in vc6 was ok., This piece here : class Model { public: int m_state; bool Initialized; CalCoreModel *m_calCoreModel; CalHardwareModel *m_calHardwareModel; }; Model *pModel; pModel = new Model(); pModel->onInit(Mesh_to_Open); Inside the onInit function, i have this line : m_calCoreModel = new CalCoreModel(); and it crashes, invalid memory blablabla, while in VC+ works fine, no leaks, nothing. Any clue on what is going wrong here ? thanks

Share this post


Link to post
Share on other sites
Advertisement
You'll need to post more code, including the exact code for the constructors in question, and the code that invokes them. Also, post the exact error message.

VC6 is (correctly) regarded as a terrible compiler, so its good you're porting to something more standards-compliant.

Share this post


Link to post
Share on other sites
Here it goes :

Model *pModel;
typedef struct myMesh
{
CalModel *anim;
};

myMesh myBot;

I call the function like this :

pModel = new Model();
myBot.anim = pModel->onInit(Mesh_to_Open, myBot.anim );




The constructor :

class Model
{
public:
bool Initialized;
CalCoreModel *m_calCoreModel;
CalHardwareModel *m_calHardwareModel;
Model();
~Model();
CalModel* onInit(const std::string& strFilename, CalModel *m_calCoreModel);
}


Model::Model()
{
Initialized = 1;
}


CalModel* Model::onInit(const std::string& strFilename, CalModel *m_calModel)
{

m_calCoreModel = new CalCoreModel("");

And crashes right here, with this message :



Unhandled exception at 0x7609d9ca in test.exe: 0xC0000005: Access violation reading location 0x6d6d7563.





Share this post


Link to post
Share on other sites
Chances are that you have a DLL linkage problem. VC++ 2003 uses a different C/C++ runtime library (MSVCRT71.DLL and the debugging analog) whereas VC++ 6.0 uses the version 6 library (MSVCRT.DLL and the debugging version).

If you're linking against another pre-compiled library (say, "Cal") then you should attempt to get libraries compiled for the version of the Microsoft compiler you're using, to minimize the possibility of runtime mis-match errors.

Share this post


Link to post
Share on other sites
I was going too, eheh, here it goes :




CalCoreModel::~CalCoreModel()
{
// destroy all core materials
std::vector<CalCoreMaterial *>::iterator iteratorCoreMaterial;
for(iteratorCoreMaterial = m_vectorCoreMaterial.begin(); iteratorCoreMaterial != m_vectorCoreMaterial.end(); ++iteratorCoreMaterial)
{
if(*iteratorCoreMaterial)
{
if((*iteratorCoreMaterial)->decRef())
{
delete (*iteratorCoreMaterial);
}
}
}
m_vectorCoreMaterial.clear();

// destroy all core meshes
std::vector<CalCoreMesh *>::iterator iteratorCoreMesh;
for(iteratorCoreMesh = m_vectorCoreMesh.begin(); iteratorCoreMesh != m_vectorCoreMesh.end(); ++iteratorCoreMesh)
{
if(*iteratorCoreMesh)
{
if((*iteratorCoreMesh)->decRef())
{
delete (*iteratorCoreMesh);
}
}
}
m_vectorCoreMesh.clear();

// destroy all core animations
std::vector<CalCoreAnimation *>::iterator iteratorCoreAnimation;
for(iteratorCoreAnimation = m_vectorCoreAnimation.begin(); iteratorCoreAnimation != m_vectorCoreAnimation.end(); ++iteratorCoreAnimation)
{
if(*iteratorCoreAnimation)
{
if((*iteratorCoreAnimation)->decRef())
{
delete (*iteratorCoreAnimation);
}
}
}
m_vectorCoreAnimation.clear();

// destroy all core morph animations
std::vector<CalCoreMorphAnimation *>::iterator iteratorCoreMorphAnimation;
for(iteratorCoreMorphAnimation = m_vectorCoreMorphAnimation.begin(); iteratorCoreMorphAnimation !=
m_vectorCoreMorphAnimation.end(); ++iteratorCoreMorphAnimation)
{
delete (*iteratorCoreMorphAnimation);
}
m_vectorCoreMorphAnimation.clear();

if(m_pCoreSkeleton != 0)
{
if(m_pCoreSkeleton->decRef())
{
delete m_pCoreSkeleton;
}
m_pCoreSkeleton = 0;
}

m_strName.erase();
}



Share this post


Link to post
Share on other sites
Quote:
Original post by hplus0603
Chances are that you have a DLL linkage problem. VC++ 2003 uses a different C/C++ runtime library (MSVCRT71.DLL and the debugging analog) whereas VC++ 6.0 uses the version 6 library (MSVCRT.DLL and the debugging version).

If you're linking against another pre-compiled library (say, "Cal") then you should attempt to get libraries compiled for the version of the Microsoft compiler you're using, to minimize the possibility of runtime mis-match errors.


Yeah, i tought about that, i already recompiled the library with VC++ 2003 with no problems.

Share this post


Link to post
Share on other sites
The CONstructor, mate, not the DEstructor. Also, please put your code inside source tags to make it more readable for us. ;)

Share this post


Link to post
Share on other sites
Oops, Here's the constructor :


CalCoreModel::CalCoreModel(const std::string& name)
: m_strName(name)
, m_pCoreSkeleton(0)
, m_userData(0)
{
}


Which calls yet another one :


CalCoreSkeleton::CalCoreSkeleton() : m_referenceCount(0)
{
}


How do the code tags work ? the syntax ?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!