【问题标题】:destructor is called continuesly [closed]析构函数被持续调用[关闭]
【发布时间】:2013-07-11 15:02:17
【问题描述】:

我目前正在开发一款在 Android 上使用 OpenGL ES 2.0 的游戏(在 C++ 中使用 NDK)。

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

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

但是析构函数被无休止地调用(就像在线程的每个循环中一样),这弄乱了我的绘图。

我有点迷失在这里,我找不到类似的问题,所以欢迎帮助!

编辑:循环代码在这里:link

Edit2:我发现了一个邪恶的召唤:

在我的播放器类中,我有这个电话:

currentWeapon->draw(this); 

void Weapon::draw(Player* p)

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

【问题讨论】:

  • 你是否在每个滴答/循环中初始化一个新的 Drawable?
  • 我们能看到循环的代码吗?
  • 在问你的问题时,你为什么选择只向我们展示析构函数?您已经告诉我们正在调用它,所以这可能没有帮助。看到它被调用的循环,或者你已经完成了一些工作来确定循环调用析构函数会有所帮助。
  • @kfsone 我这样做是因为我有这么多代码,也许它很简单。无论如何,我知道这还不清楚,所以我在这里上传了循环函数:link

标签: c++ android-ndk opengl-es-2.0 destructor


【解决方案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() 采用Drawable 按值,因此可以制作原始副本。根据其他代码,编译器甚至可能无法删除此副本。

【讨论】:

  • 感谢您的回答,但以上似乎都不是我的情况。我创建了一次对象,它们一直存在,直到我的应用程序关闭。
  • @EdwinSchriek:必须是上述情况之一。
  • 看看我的第二次编辑,“this”关键字可能是原因吗?
  • @EdwinSchriek:不。this 本身不会是原因。 this 是一个指针。但是,您可能会使用它。向我们展示Weapon::draw() 的代码。这似乎很可能是错误所在。
  • 代码在这里:link
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 2018-12-09
  • 2011-10-28
  • 2011-11-23
  • 2015-02-25
  • 2015-12-23
  • 2012-11-21
相关资源
最近更新 更多