2009-11-18 77 views
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异常。在另一个地方是一样的。 是否有可能,我用完了内存?我不这么认为,所以如果你能帮助我,我会很高兴! 再见!

+5

mesh-> numSurfacePoints的值是多少? – 2009-11-18 15:33:35

+0

你知道numSurfacePoints有多少点吗? – 2009-11-18 15:34:02

+0

是否有可能将网格作为null传入? – ChadNC 2009-11-18 15:51:07

回答

0

您是否在某处调用texCoords上的delete []?这看起来好像你的内存不足了。

+0

不,我不这样做,因为我使用它们直到程序退出。 – 2009-11-18 15:45:27

2

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

+0

它没问题。指定问题:我有一个MyMesh类,可以镶嵌N个圆锥体和金字塔。它也可以产生空心圆锥体,在这种情况下,通过圆锥体形成一个孔。如果我生成一个空心圆锥体,没关系,即使我使用20个圆锥体,但是我生成一个不空心的圆锥体,它会生成MyMesh,但是当我将它传递给MyObject构造函数时,会引发错误。 – 2009-11-18 15:48:39

2

是否有可能,我用完了内存?

当抛出std::bad_alloc时,程序使用多少内存?

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

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

+0

不幸的是,这个程序必须在我的大学的服务器上运行,所以我不能使用智能指针。 thu numSurfacePoints是36,但它运行良好,数量更多(请参阅我对Steffen的回复的评论)。我该如何检查程序使用的内存,当它崩溃时? – 2009-11-18 16:01:19

+1

这取决于操作系统。但是,很可能您的内存使用量受到大学服务器上的配额限制,如果您拥有完整的地址空间,则可能会导致内存耗尽_much_的速度比您通常会更快。 – 2009-11-18 16:06:47

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,如果没有,你的内存不足,或者堆太碎,无法分配程序在这个地方需要的数量。

+0

谢谢,但它似乎没关系。只尝试分配36个浮点数,所以它不应该是一个问题。如果没有其他猜测,那么我将开始从开始调试...呃...祝我好运:) – 2009-11-18 16:34:38

+0

你是如何发现有关35? – sbi 2009-11-18 16:50:42