我的 C++ directX 9 应用程序中有一个克隆函数,它将一个对象的所有数据(例如顶点和纹理)复制到一个新对象,而不是让一个指针指向我创建的那个 1 个对象(如果我想的话)创建多个相同类型的对象。当我运行它时一切似乎都很好,但是一旦我退出程序,它就崩溃了,我发现它与纹理有关(它没有正确删除。)。
我似乎没有正确复制 IDirect3DTexture9 纹理。这是我得到的克隆函数:
OBJMesh* OBJMesh::Clone()
{
OBJMesh* newOBJMesh = new OBJMesh();
newOBJMesh->vertexCount = vertexCount;
newOBJMesh->indicesCount = indicesCount;
memcpy(&newOBJMesh->texture, &texture, sizeof(IDirect3DTexture9));
newOBJMesh->normalMapTexture = normalMapTexture;
newOBJMesh->vertices = new VERTEX[vertexCount];
memcpy(newOBJMesh->vertices, vertices, vertexCount * sizeof(VERTEX));
DirectX::device->CreateVertexBuffer(sizeof(VERTEX) * newOBJMesh->GetVertexCount(), 0, VERTEXFORMAT, D3DPOOL_MANAGED, &newOBJMesh->vertexBuffer, NULL);
VOID* vertexLocking;
newOBJMesh->vertexBuffer->Lock(0, 0, (void**)&vertexLocking, 0);
memcpy(vertexLocking, newOBJMesh->vertices, newOBJMesh->vertexCount * sizeof(VERTEX));
newOBJMesh->vertexBuffer->Unlock();
return newOBJMesh;
}
我使用了 memcpy(&newOBJMesh->texture, &texture, sizeof(IDirect3DTexture9));
作为纹理,这是复制它的正确方法吗?或者它到底有什么问题??
最佳答案
首先,您可能应该重新考虑您的设计,因为您应该更喜欢存储指向已创建对象的指针,而不是深入复制周围的对象。
同样在 C++ 中,您正在寻找的功能通常是通过通常如下所示的复制构造函数实现的:
OBJMesh (const OBJMesh& other);
你仍然可以像这样实现一个克隆函数:
OBJMesh* OBJMesh::Clone() { return new OBJMesh(*this); }
然而,这不是必需的,并且更有可能导致内存泄漏,因为调用者负责删除对象,尽管事实上他没有调用 new
。
现在您的函数不起作用的原因是您正在复制类接口(interface) IDirect3DTexture9
的实例,而不是实际的纹理资源。这种情况下的结果很可能是未定义的,但您最终可能会得到两个对象,这些对象具有指向同一资源的指针,在您的对象和您现在无法处理的另一个纹理资源被破坏时被删除两次。
至于解决方案,这取决于您要解决的问题,但您可能想看看 instancing .
关于c++ - 在 DirectX 9 中删除 IDirect3DTexture9 纹理时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21462287/