析构函数被称为continuely 我正在使用Android上的OpenGL ES 2进行游戏(在C++中使用NDK)。

析构函数被称为continuely 我正在使用Android上的OpenGL ES 2进行游戏(在C++中使用NDK)。,c++,android-ndk,opengl-es-2.0,destructor,C++,Android Ndk,Opengl Es 2.0,Destructor,我有一个名为“Drawable”的类,它是我使用OpenGL绘制对象的基类。 在类的析构函数中,我必须清理一些缓冲区: Drawable::~Drawable() { LOGE("release"); releaseBuffers(); } 但是析构函数被无休止地调用(就像在线程的每个循环中一样),这会弄乱我的绘图 我在这里迷路了,我找不到类似的问题,所以欢迎帮助 编辑:循环代码如下: Edit2:我发现了一个邪恶的电话: 在我的玩家课程中,我有一个电话: currentWeapon->

我有一个名为“Drawable”的类,它是我使用OpenGL绘制对象的基类。 在类的析构函数中,我必须清理一些缓冲区:

Drawable::~Drawable() {
LOGE("release");
releaseBuffers();
}
但是析构函数被无休止地调用(就像在线程的每个循环中一样),这会弄乱我的绘图

我在这里迷路了,我找不到类似的问题,所以欢迎帮助

编辑:循环代码如下:

Edit2:我发现了一个邪恶的电话:

在我的玩家课程中,我有一个电话:

currentWeapon->draw(this); 


如果我对此发表评论,垃圾邮件就消失了。

调用析构函数的方法很少:

1) 您在堆栈上创建了一个
Drawable
的实例,它不在范围之内。如果这是在一个紧密的循环中完成的,那么对象将超出范围,并在循环的每次迭代中被销毁。例如:

for (size_t i = 0; i < 100; ++i)
{
  Drawable d;
}
3) 显式调用析构函数:

Drawable* b = new (buffer) Drawable;
b->~Drawable()
请注意#3使用了“placement new”(新位置),这是极不可能的


当对象在容器(如
向量
中)中时,它们可能会在意外时刻被销毁。考虑:

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

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

这是一个简单的例子,因为在这种情况下,编译器很可能省略了临时变量。但是由于
DoSomething()
按值取
可绘制的
,因此可以制作原件的副本。取决于其他代码,编译器甚至可能无法删除此副本。

是否在每个勾号/循环中初始化新的可绘制代码?我们可以看到循环的代码吗?在询问问题时,为什么选择只显示析构函数?你已经告诉我们有人打电话给你了,所以这可能没有什么帮助。看到它正在被调用的循环,或者您已经做了一些工作来确定循环调用析构函数会有什么帮助。@kfsone我之所以这么做是因为我有这么多代码,可能是因为它很简单。无论如何,我知道这还不清楚,所以我把循环函数上传到这里:谢谢你的回答,但以上两个似乎都不是我的情况。我创建了一次对象,它们一直存在,直到我的应用程序关闭。@EdwinSchriek:这一定是上述情况之一。请参阅我的第二次编辑,“this”关键字可能是原因吗?@EdwinSchriek:否。
本身不会是原因<代码>这是一个指针。然而,您对它的使用可能是错误的。向我们展示
武器::draw()
的代码。这似乎是错误所在。代码如下:
vector <Drawable> drawables;
for (size_t i = 0; i < 10000; ++i)
{
  Drawable d;
  drawables.push_back (d);
}
void DoSomething (Drawable d)
{
}

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