I come from one problem onto the next one very quickly it seems.
I have never had a problem like this one before, and I don't think the reason is as stupid as the last one (though I could definitely be wrong).
Anyways, when I try to release stored mesh data in my program I am given an unhandled exception (again). The debugger tells me it roots back to IUnknown, specifically I get this error:
__vfptr CXX0030: Error: expression cannot be evaluated
Here is the code for the class where the destructor is being called in which this error is generated:
Code:
class MeshContainer {
private:
vector<Mesh *> MeshList;
public:
MeshContainer() {}
~MeshContainer() {
if(MeshList.size() > 0) {
for(DWORD i=0; i<MeshList.size(); i++) {
if(MeshList[i]->MeshData != NULL) {
MeshList[i]->MeshData->Release();
MeshList[i]->MeshData = NULL;
}
delete MeshList[i];
}
MeshList.clear();
}
}
int DrawMesh(DWORD dwMeshID);
int LoadMesh(IDirect3DDevice9* &g_pd3dDevice, int iMeshNum);
};
I am getting the error from the line:
Code:
MeshList[i]->MeshData->Release();
When I reach there, the program crashes.
Here is the mesh structure for reference:
Code:
struct Mesh {
DWORD dwID;
DWORD dwNumSubsets;
ID3DXMesh* MeshData;
Mesh() {
dwID = 0;
dwNumSubsets = 0;
MeshData = NULL;
}
};
And since I don't want to give to little like last time...
Here is the wrapper class which the MeshContainer class is used in:
Code:
class ResourceCache {
private:
friend class CObjectManager;
MaterialContainer *Materials;
TextureContainer *Textures;
MeshContainer *Meshes;
public:
ResourceCache() {
Materials = new MaterialContainer();
Textures = new TextureContainer();
Meshes = new MeshContainer();
}
~ResourceCache() {
delete Materials;
delete Textures;
delete Meshes;
}
int DrawMesh(DWORD dwMeshID) {
return Meshes->DrawMesh(dwMeshID);
}
int CreateMesh(LPDIRECT3DDEVICE9 &g_pd3dDevice, int iMeshNum) { return Meshes->LoadMesh(g_pd3dDevice, iMeshNum); }
};
Here is the initialization of that wrapper class elsewhere:
Code:
ResourceCache* ResourceList = new ResourceCache();
And finally, here is the deletion statement for that wrapper class object:
Code:
delete ResourceList;
Here is the function in which I create the mesh data:
Code:
int MeshContainer::LoadMesh(IDirect3DDevice9* &g_pd3dDevice, int iMeshNum) {
Mesh *TempMesh = new Mesh();
switch(iMeshNum) {
case MESH_TEAPOT: // Create a Teapot
if(FAILED(D3DXCreateTeapot(g_pd3dDevice, &TempMesh->MeshData, 0)))
return false;
TempMesh->dwNumSubsets = 0;
TempMesh->dwID = 0;
break;
default:
return false;
break;
}
MeshList.push_back(TempMesh);
return true;
}
I am using MSVC++ 2005 EE (still). I'm not sure what the best way to explain the problem is. All I know is, I can't access the MeshData->Release() function successfully. This is a pain and it shouldn't be. I'm stumped (again). If something needs further clarification, just ask and I'll try to explain better.
Thanks in advance... .