0

我的 C++/openGL 程序有问题。

在某些代码点,比如这些(它是一个构造函数):

MyObject(MyMesh * m, MyTexture* t, float *c=NULL, float *sr=NULL, int sh=100){
texture=t;
mesh=m;
subObjects=NULL;
texCoords=NULL;
if (texture!=NULL){
        texCoords=new float[mesh->numSurfacePoints*2];

新的抛出一个 std::bad_alloc 异常。在另一个地方也是一样。有没有可能,我的内存用完了?我不这么认为,所以如果你能帮助我,我会很高兴!再见!

4

4 回答 4

2

您还应该检查mesh->numSurfacePoints它的值可能是假的或负的,这也可能是错误的根源。

于 2009-11-18T15:34:43.690 回答
2

有没有可能,我的内存用完了?

std::bad_alloc抛出时你的程序使用了多少内存?

mesh->numSurfacePoints它崩溃时的价值是多少?您绝对确定传入的指针mesh是有效指针吗?如果您有一个非常碎片化的地址空间,则可能没有足够的连续空间来分配一个大数组。你的程序在std::bad_alloc被抛出之前运行了多长时间?

如果您还没有,您应该考虑boost::scoped_array对数组使用或其他形式的智能指针,以便在不再需要堆分配的对象时自动删除。

于 2009-11-18T15:57:25.280 回答
1

实际上,使用现代操作系统,您不太可能耗尽内存。在你这样做之前,机器会频繁更换,以至于它或多或少地无法使用——你不能错过。此外,当我几年前使用 Win2k 进行实验时,我发现当我的测试应用程序分配尽可能多的内存时,几乎每个应用程序都会崩溃。(这包括调试器、办公应用程序、浏览器、电子邮件应用程序,甚至记事本。)

所以我假设你要么试图分配一个不合理的大数量,要么堆变得非常碎片化,以至于它甚至无法满足合理的请求。

以这种方式编写代码怎么样:

// for example
const std::size_t arbitrary_max_size_constant = std::vector<float>::max_size();
// or std::nummeric_traits<std::size_T>.max() / 10; 

if (texture!=NULL){
  assert(mesh->numSurfacePoints < arbitrary_max_size_constant);
  texCoords = new float[mesh->numSurfacePoints*2];
  // ...
}

如果您的程序有错误,这将在调试模式下提醒您,但不会减慢发布代码。另一种可能性是您捕获异常并打印程序试图分配的内存:

if (texture!=NULL) {
  try {
    texCoords = new float[mesh->numSurfacePoints*2];
  } catch(const std::bad_alloc& x) {
    std::cerr << "failed to allocate << mesh->numSurfacePoints*2 << " bytes!\n";
    throw;
  }
  // ...
}

通过这种方式,您还将看到该值是否大得不合理。如果是,你就有了一个错误,如果不是,你要么内存不足,要么堆太碎片化,无法在这个地方分配程序需要的数量。

于 2009-11-18T16:15:54.823 回答
0

您是否在某个时候在 texCoords 上调用 delete[] ?看起来你的内存肯定用完了。

于 2009-11-18T15:34:07.617 回答