2013-07-11 3 views
-1

В настоящее время я работаю над игрой с использованием OpenGL ES 2.0 на Android (в C++ с использованием NDK).деструктор называется continuely

У меня есть класс под названием «Drawable», который является моим базовым классом для рисования объектов с использованием OpenGL. В деструкторе класса я должен очистить некоторые буфера:

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

Но деструктор бесконечно (как и в каждом цикле нити), которая портит мой рисунок.

Я как бы потерялся здесь, и я не мог найти подобных проблем, поэтому помощь приветствуется!

Edit: код Loop здесь: link

Edit2: Я нашел один из злых звонков:

В моем классе игрока у меня есть этот вызов:

currentWeapon->draw(this); 

к

void Weapon::draw(Player* p) 

Если я прокомментирую это, спам исчезнет.

+0

Вы инициализируете новый Drawable каждый тик/цикл? –

+0

Можем ли мы увидеть код для цикла? – IanPudney

+1

Когда вы задавали свой вопрос, почему вы решили показать нам ничего, кроме деструктора? Вы уже сказали нам, что его зовут, так что, вероятно, это не поможет. Видя цикл, в котором он вызывается, или что вы сделали НЕКОТОРУЮ работу, чтобы определить, что из цикла вызовет деструктор, помогло бы. – kfsone

ответ

1

Есть очень мало способов деструктор вызывается:

1) Вы создаете экземпляр Drawable в стеке, и он выходит из области видимости. Если это делается в замкнутом цикле, объект будет выпадать из области действия и будет уничтожен на каждой итерации цикла. Например:

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

Здесь, 100 экземпляров Drawable будут созданы и уничтожены, в начале и в конце каждого цикла.

2) Вы delete динамически распределённая Drawable:

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

3) Вы называете деструктор явно:

Drawable* b = new (buffer) Drawable; 
b->~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() принимает по стоимости может быть сделана копия оригинала. В зависимости от другого кода компилятор, возможно, даже не сможет удалить эту копию.

+0

Спасибо за ответ, но ни одно из вышеизложенного не похоже на мое дело. Я создаю объекты один раз, и они существуют, пока мое приложение не отключится. –

+0

@EdwinSchriek: Он должен быть одним из вышеуказанных случаев. –

+0

См. Мое второе редактирование, может ли это ключевое слово быть причиной? –

Смежные вопросы