【问题标题】:C++ bad_alloc at memory location Exception内存位置异常的 C++ bad_alloc
【发布时间】:2023-03-29 22:07:01
【问题描述】:

OSGP.exe 中 0x758cd36f 处的未处理异常:Microsoft C++ 异常:内存位置 0x0028ef70 处的 std::bad_alloc..

我正在尝试在 Visual Studio 中执行以下代码。但是,我一直遇到上述异常。我添加了一个 try catch 来帮助我捕捉错误,但似乎无济于事。我认为问题与输出窗口中的以下内容有关

First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0019f2f4..
First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0019ec84..
First-chance exception at 0x758cd36f in OSGP.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
The thread 'Win32 Thread' (0x16dc) has exited with code 0 (0x0).
The program '[448] OSGP.exe: Native' has exited with code 0 (0x0).**

代码如下:

#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <new>

#include "stdafx.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{ 
    int flag = false;
    osgViewer::Viewer viewer;
     osg::ref_ptr<osg::Node> root;
    try
    { 
        root = osgDB::readNodeFile("cessna.osg");
        viewer.setSceneData(root.get()); 
    }
    catch(bad_alloc)
    { 
        if (flag) cout << "a bad_alloc exception just occured"; 
    }
    return viewer.run(); 
}

【问题讨论】:

  • osgDB::readNodeFile("cessna.osg"); 如果无法打开文件,则可以返回 nullptr。仅供参考,将bool 分配给从未真正使用过的int 标志也有点愚蠢;-)
  • 大部分输出只是调试器告诉你它找不到程序数据库(符号)文件。
  • Debug-&gt;Exceptions...-&gt;C++ Exceptions 中开启异常断点,以便在抛出 bad_alloc 时停止。

标签: c++ visual-studio-2010 opengl openscenegraph


【解决方案1】:

std::bad_alloc 通常在程序没有足够的内存来完成请求的操作时抛出。

可能的问题:

  • cessna.org 太大,无法在您正在运行的机器上处理 这个在
  • cessna.org 中的错误数据/逻辑导致它尝试分配 无限的内存

但是根据给出的信息是不可能的。

【讨论】:

  • 我可以从命令行使用 osgviewer 打开 cessna.osg,没有问题,但是添加代码然后运行它,我得到了那个异常。我想调试它,这就是我添加 try catch 的原因,但这还没有帮助我弄清楚那个小程序有什么问题。
  • 除非您有 OSGP.exe 的源代码和符号,否则您将无法调试 OSGP.exe 中发生的错误。您也可以让 Visual Studio 在抛出异常时提示您,而不是通过转到 Debug->Exceptions 并添加 std::bad_alloc 作为 C++ Exception 来使用 try/catch
【解决方案2】:

我应该通过披露我的编码专业知识可以被慷慨地描述为新手来限定此回复。

我在运行一些代码时遇到了类似的错误。原因似乎是当我像这样声明一个新数组时:

path_chr = new char [path.size()+1];

我在我的代码中多次这样做(数百万次?)。看来我最终内存不足。修复是在我完成后删除变量。

delete [] path_chr;

在那之后再也没有遇到过问题。

【讨论】:

    【解决方案3】:

    如果在对象的构造函数中传递了指向无效内存的指针,也可能会抛出错误的分配。

    【讨论】:

      【解决方案4】:

      将解决方案平台 x86 更改为 x64。 RAM 为 16Gb,但 x86 的视觉寻址仅 4Gb 块

      【讨论】:

        【解决方案5】:

        我发现当您尝试读取数组末尾之后会发生这种情况。也就是说,如果您尝试访问的元素多于数组中存在的元素数量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 2011-08-14
          • 1970-01-01
          • 2012-02-13
          • 2011-10-20
          • 2011-04-01
          • 1970-01-01
          相关资源
          最近更新 更多