Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配数组时新运算符出现问题_C++_Arrays_New Operator_Bad Alloc - Fatal编程技术网

C++ 分配数组时新运算符出现问题

C++ 分配数组时新运算符出现问题,c++,arrays,new-operator,bad-alloc,C++,Arrays,New Operator,Bad Alloc,我的C++/openGL程序有问题 在代码的某一点上,例如(它是一个构造函数): 新的抛出一个std::bad_alloc异常。在另一个地方也是一样的。 有没有可能,我的内存用完了?我不这么认为,所以如果你能帮助我,我会很高兴的! 再见 您是否在某个时候调用texCoords上的delete[]?显然,您的内存不足。您是否在某个时候调用texCoords上的delete[]命令?显然,您的内存不足。您还应该检查mesh->numSurfacePoints的值,可能是假的或负数,这也可能是错误的来

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

在代码的某一点上,例如(它是一个构造函数):

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

您是否在某个时候调用texCoords上的delete[]?显然,您的内存不足。

您是否在某个时候调用texCoords上的delete[]命令?显然,您的内存不足。

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

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

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

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

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

如果你还没有,你应该考虑使用<代码> Boo::SimeDePieldSux或其他形式的智能指针数组,以便在不再需要堆分配对象时自动删除。 有没有可能,我的内存用完了

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

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


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

< P>实际上,使用现代操作系统,你不太可能内存不足。在你这么做之前,这台机器的交换量会很大,或多或少会变得不可用——你不会错过的。另外,几年前,当我用Win2k进行实验时,我发现当我的测试应用程序分配尽可能多的内存时,几乎每个应用程序都会崩溃。(其中包括调试器、office应用程序、浏览器、电子邮件应用程序,甚至记事本。)

因此,我假设您正在尝试分配不合理的大量资源,或者堆变得支离破碎,甚至无法满足合理的请求

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

// 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];
  // ...
}
//例如
常量std::size\u t任意_max\u size\u常量=std::vector::max\u size();
//或std::nummeric_traits.max()/10;
如果(纹理!=NULL){
断言(网格->numSurfacePoints<任意\u最大\u大小\u常数);
texCoords=新浮点[mesh->numSurfacePoints*2];
// ...
}
如果您的程序有bug,这将在调试模式中提醒您,但不会减慢发布代码的速度。另一种可能是捕获异常并打印程序试图分配的内存:

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;
  }
  // ...
}
if(纹理!=NULL){
试一试{
texCoords=新浮点[mesh->numSurfacePoints*2];
}捕获(常数标准::错误分配和x){

std::cerr事实上,在现代操作系统中,内存不太可能耗尽。在你这么做之前,机器将进行大量的交换,或多或少变得不可用-你不能错过这一点。此外,几年前,当我用Win2k进行实验时,我发现当我的测试应用程序allocated尽可能多的存储空间(包括调试器、office应用程序、浏览器、电子邮件应用程序,甚至记事本)

因此,我假设您正在尝试分配不合理的大量资源,或者堆变得支离破碎,甚至无法满足合理的请求

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

// 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];
  // ...
}
//例如
常量std::size\u t任意_max\u size\u常量=std::vector::max\u size();
//或std::nummeric_traits.max()/10;
如果(纹理!=NULL){
断言(网格->numSurfacePoints<任意\u最大\u大小\u常数);
texCoords=新浮点[mesh->numSurfacePoints*2];
// ...
}
如果您的程序有bug,这将在调试模式中提醒您,但不会减慢发布代码的速度。另一种可能是您捕获异常并打印程序试图分配的内存:

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;
  }
  // ...
}
if(纹理!=NULL){
试一试{
texCoords=新浮点[mesh->numSurfacePoints*2];
}捕获(常数标准::错误分配和x){

std::cerr网格->numSurfacePoints的值是多少?您知道numSurfacePoints中有多少个点吗?网格是否可以作为null传递?您应该使用
std::vector
。值是36,网格不是null网格->numSurfacePoints的值是多少?您知道numSurfacePoints中有多少个点吗?是否正确可以将网格作为空值传递吗?您应该使用
std::vector
。值为36,网格不是空的。要指定问题:我有一个MyMesh类,它可以镶嵌N边圆锥体和棱锥。它还可以生成空心圆锥体,在这种情况下,圆锥体上有一个孔。如果生成空心圆锥体,它是空的好的,即使我使用20个边锥,但如果我生成一个非空心锥,它会生成MyMesh,但当我将其传递给MyObject构造函数时,它会抛出错误。好的。要指定问题,我有一个MyMesh类,它可以细分N个边锥和py