2013-07-11 1 views
-1

저는 현재 Android에서 OpenGL ES 2.0을 사용하는 게임을하고 있습니다 (C++에서는 NDK 사용).소멸자가 계속 호출됩니다.

OpenGL을 사용하여 객체를 그리는 기본 클래스 인 "Drawable"클래스가 있습니다. 클래스의 소멸자에서 는 좀 버퍼를 정리해야합니다 :

Drawable::~Drawable() { 
LOGE("release"); 
releaseBuffers(); 
} 

하지만 소멸자 내 그림을 엉망으로, (스레드의 모든 루프에서와 같이) 끝없이이라고합니다.

나는 여기에서 길을 잃어 버렸고 유사한 문제를 찾을 수 없어 도움을 환영합니다!

편집 : 루프 코드는 여기에 있습니다 : link

Edit2가 :

currentWeapon->draw(this); 

에 :이 호출이 내 플레이어 클래스에서

: 나는 악마 호출 중 하나를 발견

void Weapon::draw(Player* p) 

내가이를 설명하면 스팸이 사라집니다.

1) 당신은 스택에 Drawable의 인스턴스를 생성하고,이 범위를 벗어날 :

+0

틱/루프마다 새로운 드로어 블을 초기화합니까? –

+0

루프 코드를 볼 수 있습니까? – IanPudney

+1

질문 할 때, 왜 우리에게 소멸자 이외의 것을 보여 주기로 선택하셨습니까? 이미 전화가 걸려 왔다고해서 아마 도움이되지 않을 것입니다. 루프가 호출되는 것을 보거나, 루프가 소멸자를 호출하는 것이 무엇인지 판단하기 위해 어떤 작업을 수행했다면 도움이되었을 것입니다. – kfsone

답변

1

은 소멸자가 호출되는 매우 몇 가지 방법이 있습니다. 이것이 단단한 루프에서 수행되면, 오브젝트는 범위를 벗어나서 루프의 반복마다 파괴됩니다. 예를 들어

for (size_t i = 0; i < 100; ++i) 
{ 
    Drawable d; 
} 

여기서 Drawable 100 개 인스턴스가 생성되며, 모든 루프의 시작과 끝에서, 파괴.

2) 당신 deleteDrawable 동적으로 할당 : # 3 사용 "배치 새로운"하고 매우 것을

Drawable* b = new (buffer) Drawable; 
b->~Drawable() 

참고 :

for (size_t i = 0; i < 100; ++i) 
{ 
    Drawable* d = new Drawable; 
    delete drawable; 
} 

3) 당신은 명시 적으로 소멸자를 호출 있을 것 같지 않게. 그들은 이러한 vector로서 컨테이너에있을 때


오브젝트는 회 놀라운 일 파괴 될 수있다. 고려 :이 코드를 실행하면

vector <Drawable> drawables; 
for (size_t i = 0; i < 10000; ++i) 
{ 
    Drawable d; 
    drawables.push_back (d); 
} 

당신은 잠재적으로 많은 소멸자 호출을 알 수 있습니다. push_back 때 사본이 만들어지고 원본 (d 여기)이 파괴됩니다. 또한 vector이 용량에 도달하면 다시 할당해야하므로 모든 항목이 다시 복사되고 원본이 삭제됩니다.


개체는 또한 임시 변수 예기치 복사 얼굴 놀라운 일 시간을 파괴 할 수있다.다음을 고려하십시오.

void DoSomething (Drawable d) 
{ 
} 

int main() 
{ 
    Drawable d; 
    for (size_t i = 0; i < 1000; ++i) 
    { 
    DoSomething (d); 
    } 
} 

컴파일러가이 경우 임시 파일을 삭제할 가능성이 있기 때문에이 예제는 간단한 예제입니다. 그러나 DoSomething()Drawable값이이므로 원본 사본을 만들 수 있습니다. 다른 코드에 따라 컴파일러는이 복사본을 삭제할 수 없을 수도 있습니다.

+0

대답 주셔서 감사하지만 위의 두 경우 내 것 같다. 개체를 한 번 만들고 내 응용 프로그램이 종료 될 때까지 존재합니다. –

+0

@EdwinSchriek : 위의 경우 중 하나 여야합니다. –

+0

두 번째 편집을 참조하십시오. "this"키워드가 원인 일 수 있습니까? –

관련 문제