分配数组时operator new的问题

时间:2009-11-18 15:31:07

标签: c++ arrays new-operator bad-alloc

我在使用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];

new抛出std :: bad_alloc异常。在另一个地方也一样。 我有可能跑出记忆吗?我不这么认为,所以如果你能帮助我,我会很高兴的! 再见!

4 个答案:

答案 0 :(得分:2)

您还应该检查mesh->numSurfacePoints的值,也许是伪造的还是负面的,这也可能是错误的根源。

答案 1 :(得分:2)

  

是否有可能,我的内存不足?

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

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

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

答案 2 :(得分: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;
  }
  // ...
}

通过这种方式,您还可以看到价值是否过高。如果是,你有一个bug,如果不是,你要么内存不足,要么堆太碎,无法分配程序在这个地方需要的数量。

答案 3 :(得分:0)

你在某些时候在texCoords上调用delete []吗?看起来你的内存似乎已经不足了。