Деструктор удалить неправильный элемент - PullRequest
0 голосов
/ 19 мая 2018

У меня небольшая проблема с моими текстурами.

Я хочу, чтобы:

  • m_texture имеет текстуру с id # 5
  • Текстура с ID #5 следует НЕ удалить.

Проблема : В данный момент текстура №5 удалена.

Текстура удалена сама вДеструктор.

inline void SetTexture(Texture texture) //texture -> #5, m_texture -> #7
{ 
    m_texture = texture;
    //m_texture -> #5
    //texture -> #5
    // But #5 is deleted, and I don't want that
}

[...]

private:
    Texture m_texture;

Редактировать:

Это работает:

Texture texture(0, 102, 153);
rect.SetTexture(texture);

Но это не так:

rect.SetTexture(Texture(0, 102, 153));

Редактировать 2: Я думаю, что вопрос будет закрыт, потому что это слишком много кода.[Извините]

Текстовый заголовок:

class Texture
{
public:
    Texture(const std::string& fileName);
    Texture(int red, int green, int blue);

    void Bind();
    virtual ~Texture();

protected:
private:

    void Init(unsigned char* imageData, int width, int height);
    GLuint m_texture;

};

Класс текстуры:

Texture::Texture(const std::string& fileName)
{
    int width, height, numComponents;
    unsigned char* imageData = stbi_load((fileName).c_str(), &width, &height, &numComponents, 4);

    if (imageData == NULL)
        std::cerr << "Texture loading failed for texture: " << fileName << std::endl;

    Init(imageData, width, height);

    stbi_image_free(imageData);
}
Texture::Texture(int red, int green, int blue)
{
    unsigned char imageData[] = {
        static_cast<char>(red),
        static_cast<char>(green),
        static_cast<char>(blue)
    };

    Init(imageData, 1, 1);
}

void Texture::Init(unsigned char* imageData, int width, int height) {
    glGenTextures(1, &m_texture);
    glBindTexture(GL_TEXTURE_2D, m_texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
}

Texture::~Texture()
{
    glDeleteTextures(1, &m_texture);
}

void Texture::Bind()
{
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, m_texture);
}

1 Ответ

0 голосов
/ 19 мая 2018

Похоже, ваша ошибка в том, как вы назначаете идентификаторы для Texture s.

Поскольку у вас есть удаление во время уничтожений, там должны быть указатели, которые вы не указали в своем сообщении.

Объект текстуры, вероятно, не следует правилу из трех .

Если у вас есть копия, задание или деструктор, тогда вам нужно сделатьвсе три.


Пройдите через то, что в настоящее время делает ваш код:

inline void SetTexture(Texture texture) //Texture::Texture(Texture) is called
{ 
    m_texture = texture; //Texture::operator= is called
} //Texture::~Texture() is called

Идеальное поведение:

  1. Идентификатор в texture должен совпадать с идентификатором, переданным в качестве параметра.
  2. Этот идентификатор должен быть передан в m_texture.
  3. Когда texture уничтожен, это не единственная ссылкак удостоверению личности, и так не разрушает его.

Это целочисленное использование shared_ptr.

...