我知道之前已经问过这个问题,但没有看到我的问题的正确解决方案,我的问题是当我创建一个类的指针(PAGTexture)时一切正常然后,那个指针被传递给另一个类作为变量,在新的类(PAGRevolutionObject)中,我从PAGTexture调用一个方法,然后抛出异常。调试我意识到它实际上进入了那个方法但是"这个"指针为空" 0x00000000"。 这是我的PAGTexture cpp:
#include "PAGTexture.h"
PAGTexture::PAGTexture()
{}
PAGTexture::~PAGTexture()
{
}
void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter)
{
int imgWidth, imgHeight;
unsigned char *image;
image = SOIL_load_image(path_img,
&imgWidth,
&imgHeight,
0,
SOIL_LOAD_RGBA);
if (imgWidth == 0) {
std::cout << "Failed to load image." << std::endl;
}
GLuint id_img;
glGenTextures(1, &id_img);
glBindTexture(GL_TEXTURE_2D, id_img);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgWidth, imgHeight,
0, GL_RGBA, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
ep = id_img;
id_imgs.push_back(id_img);
SOIL_free_image_data(image);
}
void PAGTexture::applyTexture(GLuint id, int pos)
{
glActiveTexture(id);
glBindTexture(GL_TEXTURE_2D, id_imgs.at(pos));
}
当&#34; applyTexture&#34;它变成空指针。被调用是因为它试图从id_imgs.at(pos)获取id,而这个是null。
这就是我打电话给#34; applyTexture&#34;:
的部分GLuint t = 33984;
if (id_revol.size() != 0) {
for (int i = 0; i < id_revol.size(); i++) {
shader_used->setUniform("TexSamplerColor", i);
textures->applyTexture(t + i, id_revol.at(i));
}
}
请注意,纹理不是空指针,因为我可以访问&#34; applyTexture&#34;从那里。
这是我调试的图像: Image Debugging the process
我还尝试设置一个数据断点,以便知道我的代码的哪一部分在"tutorial"之后使指针损坏但我无法为我的vs版本(VS2015)设置该断点。
老实说,我认为我的问题是我从另一个班级覆盖记忆(我的项目很大)但即便如此我想问一下我是否还有什么东西不见了
顺便说一句,我在调试模式下使用Visual Studio 2015(不是发行版)。
提前感谢您的回答。
EDIT1: 根据我的要求,我定义了PAGTexture:
PAGTexture *texturesPack = new PAGTexture();
texturesPack->loadTexture("Textures/check.png", GL_LINEAR, GL_LINEAR);
texturesPack->loadTexture("Textures/HeadSpider.png", GL_LINEAR, GL_LINEAR);
texturesPack->loadTexture("Textures/wood.jpg", GL_LINEAR, GL_LINEAR);
objeto2->drawLowerBodySpiderAndHead(texturesPack);
最终编辑: 谢谢大家回答,我的问题是我在内联函数中绑定了指针,似乎你不能这样做(仍然不知道为什么),无论如何我已经学到了一些我认为可能很重要的点,所以再次感谢:D
答案 0 :(得分:5)
假设:&#34;纹理不是空指针,因为我可以访问&#34; applyTexture&#34;从那里。&#34;是错的。 applyTexture
不是函数指针,它是类方法。
编译器实际上将对象表示法调用转换为:
PAGTexture::applyTexture(textures, t + i, id_revol.at(i));
传递nullptr
并不像编辑器那样烦恼。但是在输入方法时,this==nullptr
会在您访问成员时崩溃。
与数据成员不同(可能会立即崩溃),因此您会感到困惑。
为了安全起见,你可以做以下事情:
void PAGTexture::loadTexture(char * path_img, GLuint min_filter, GLuint mag_filter)
{
assert(this!=nullptr);
如果使用空指针调用方法,则会因失败的断言而崩溃(注意:仅在关闭优化时有效,否则编译器会认为this
在优化时不能nullptr
-O1
)