我在使用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异常。在另一个地方也一样。 我有可能跑出记忆吗?我不这么认为,所以如果你能帮助我,我会很高兴的! 再见!
答案 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 []吗?看起来你的内存似乎已经不足了。