C++ C++;指针损坏?
老实说,我不知道标题是否适合我所遇到的问题。因此,问题是这样的。我有一个名为Engine的类,其中有一个实例 它包含两个名为C++ C++;指针损坏?,c++,pointers,corruption,C++,Pointers,Corruption,老实说,我不知道标题是否适合我所遇到的问题。因此,问题是这样的。我有一个名为Engine的类,其中有一个实例 它包含两个名为testTexture的成员变量(以及其他变量),它们是我的自定义Texture类的一个实例,以及我的自定义对象类的一个实例testObject 在发动机功能Init中,其值设置如下: testTexture = Texture(0, TEXT("D:\\spriteWallVertical112.png"), renderer.
testTexture
的成员变量(以及其他变量),它们是我的自定义Texture
类的一个实例,以及我的自定义对象类的一个实例testObject
在发动机功能Init
中,其值设置如下:
testTexture = Texture(0, TEXT("D:\\spriteWallVertical112.png"),
renderer.ReturnDevice());
testObject = Object(0,testTexture.textureID, D3DXVECTOR3(0,0,0),
D3DXVECTOR3(100,100,100), testTexture.texture, &renderer);
这一切似乎都像我所希望的那样发挥作用,它们的值被存储起来,并且似乎得到了很好的维护
但是,在对象
类构造函数中,有一个对我的呈现程序
类中名为AddNewTextureObject
的函数的调用:
rendererPointer->AddNewTextureObject(&objectID, &textureID, textureInput,
&origin, &coordinates);
这看起来很正常,但当程序运行这些值时,指针似乎会随着程序的运行而被覆盖。它们不会立刻变成垃圾记忆,但很明显它们是。我可以根据需要提供代码,但我不想只是用与问题无关的代码垃圾发送这个问题,特别是如果其他人可能看到我明显做错了什么
不过,我现在将发布TextureObject
类代码,因为我认为它在这里最相关:
#ifndef TEXTUREOBJECT_H
#define TEXTUREOBJECT_H
#ifndef UNICODE
#define UNICODE
#endif
#include <d3dx9.h>
class TextureObject
{
public:
TextureObject();
TextureObject(unsigned int *, int *, LPDIRECT3DTEXTURE9, D3DXVECTOR3 *, D3DXVECTOR3 *);
~TextureObject();
unsigned int *objectID; // The object with the texture. Use this for locating and deleting this instance of TextureObject.
int *textureID;
LPDIRECT3DTEXTURE9 texture; // May not be needed if we can simply select the texture via ID.
const D3DXVECTOR3 *origin; // Needed for drawing rotations....I think.
D3DXVECTOR3 *coordinates;
int maintainMe;
};
#endif
请注意,将值赋给testTextureObject
的任何一种方法都会导致此问题
对此,我们将不胜感激
编辑:
下面是对象
类的构造函数:
Object::Object(unsigned int objectIDInput, int textureIDInput, D3DXVECTOR3 originInput, D3DXVECTOR3 coordinatesInput, LPDIRECT3DTEXTURE9 textureInput, Renderer *rendererInput)
{
objectID = objectIDInput;
textureID = textureIDInput;
origin = originInput;
coordinates = coordinatesInput;
rendererPointer = rendererInput;
rendererPointer->AddNewTextureObject(&objectID, &textureID, textureInput, &origin, &coordinates);
}
它在Object
类的Object.h
中声明为public,如下所示:
对象(无符号整数、整数、D3DXVECTOR3、D3DXVECTOR3、LPDIRECT3DTEXTURE9、渲染器*)代码>
EDIT2:我制作了一个复制构造函数和一个赋值运算符:
Object::Object(const Object &source)
{
objectID = source.objectID;
textureID = source.textureID;
texture = source.texture;
origin = source.origin;
coordinates = source.coordinates;
rendererPointer = source.rendererPointer;
}
Object& Object::operator=(const Object &source)
{
if(this == &source)
{
return *this;
}
objectID = source.objectID;
textureID = source.textureID;
texture = source.texture;
origin = source.origin;
coordinates = source.coordinates;
rendererPointer = source.rendererPointer;
return *this;
}
这些对你们更有经验的人来说正确吗?不幸的是,单凭这一点似乎无法解决问题。因为您定义了析构函数,并且在TextureObject
类中有指针,所以您需要遵循第3条规则:定义析构函数、复制构造函数和赋值运算符。似乎指针可能来自对象
,因此您可能也需要对该类执行相同的操作
我认为您所面临的问题是一个悬而未决的指针问题,在初始化testObject
之后,用于初始化它的临时指针将销毁,并释放其中初始化的指针。因此,testTextureObject
现在持有指向已释放内存的指针(因为这些指针最初来自临时内存)
编辑:基于对象的构造函数
,我们看到renderpointer->AddNewTextureObject
正在从当前对象
实例传递指针,该实例将是临时的
testObject = Object(0,testTexture.textureID, D3DXVECTOR3(0,0,0),
D3DXVECTOR3(100,100,100), testTexture.texture, &renderer);
这行代码创建一个对象的临时实例
,然后使用赋值运算符初始化测试对象
。在这行代码之后,临时文件将被销毁。现在,renderer
保存着一个TextureObject
,该对象从一个不再存在的临时对象初始化为指针
编辑:您似乎对规则3试图帮助您解决的问题有些困惑。你可以阅读关于3法则的问题的答案。但是,给你一个简单的例子,只考虑分配内存的类的简单问题。
class Foo {
Bar *bar;
public:
Foo () : bar(new Bar) {}
~Foo () { delete bar; }
Bar * get_bar () { return bar; }
};
要求析构函数不泄漏内存。但是,如果使用复制构造函数或赋值运算符,则会出现问题
Foo a;
Foo b(a); // copy
b
的问题在于它与a
持有相同的指针。因此,当b
和a
被破坏时,指针将被删除两次
Foo a;
Foo c;
c = a; // assign
c
的问题在于,它不仅持有与a
相同的指针(这将导致双重删除),而且它在构造函数中创建的任何内存现在都已泄漏
3的规则是:如果需要析构函数,那么复制构造函数和赋值运算符也是如此。该规则的目的是让开发人员思考需要通过添加析构函数来解决的问题,以及这些问题会对复制构造和赋值产生什么后果,并创建合理的解决方案
在您的情况下,渲染器
持有由临时对象
创建的纹理对象
。您需要考虑如何修复这种情况,或者在对象的析构函数、复制构造函数和赋值运算符中,或者通过其他解决方案来避免问题。由于您定义了析构函数,并且TextureObject
类中有指针,因此需要遵循规则3:定义析构函数,复制构造函数和赋值运算符。似乎指针可能来自对象
,因此您可能也需要对该类执行相同的操作
我认为您所面临的问题是一个悬而未决的指针问题,在初始化testObject
之后,用于初始化它的临时指针将销毁,并释放其中初始化的指针。因此,testTextureObject
现在持有指向已释放内存的指针(因为这些指针最初来自临时内存)
编辑:基于对象的构造函数
,我们看到renderpointer->AddNewTextureObject
正在从当前对象
实例传递指针,该实例将是临时的
testObject = Object(0,testTexture.textureID, D3DXVECTOR3(0,0,0),
D3DXVECTOR3(100,100,100), testTexture.texture, &renderer);
这行代码创建一个对象的临时实例
,然后使用赋值运算符初始化测试对象
。在这行代码之后,临时文件将被销毁。现在,renderer
持有一个初始化为指针的TextureObject