Works in VC6++, fails in VC2003

Started by
10 comments, last by Bruno 17 years, 10 months ago
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
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.
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.





It crashes within the constructor of CalCoreModel then?
Please post your CalCoreModel constructor, too, Bruno.
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.
enum Bool { True, False, FileNotFound };
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();
}



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.
The CONstructor, mate, not the DEstructor. Also, please put your code inside source tags to make it more readable for us. ;)
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 ?

This topic is closed to new replies.

Advertisement