相关疑难解决方法(0)

如何捕获空指针异常?

  try {
        int* p = 0;
        *p = 1;
    } catch (...) {
        cout << "null pointer." << endl;
    }
Run Code Online (Sandbox Code Playgroud)

我试图抓住这样的例外,但它没有用,有什么帮助吗?

c++ exception-handling try-catch

41
推荐指数
5
解决办法
7万
查看次数

AccessViolationException从C++/CLI DLL读取在C++应用程序中分配的内存

我有一个C++客户端到C++/CLI DLL,它初始化一系列C#dll.

这曾经工作过.失败的代码没有改变.在抛出异常之前,不会调用已更改的代码.我的编译环境已经改变,但是在具有类似于旧环境的机器上重新编译仍然失败.(编辑:我们在答案中看到这并不完全正确,我只是在旧环境中重新编译库,而不是库和客户端一起重新编译.客户端项目已经升级,无法轻易返回.)

除了我之外,有人重新编译了库,我们开始遇到内存管理问题. The pointer passed in as a String must not be in the bottom 64K of the process's address space. 我重新编译了它,并且没有代码更改都运行良好.(警报#1)最近它被重新编译,并且字符串的内存管理问题重新出现,而这次它们并没有消失.新的错误是Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

我很确定问题不在我看到异常的位置,代码在成功和失败的构建之间没有变化,但我们应该检查完成.忽略事物的名称,我对这些字符串的设计没有多少控制权.抱歉混淆,但请注意_bridge并且bridge是不同的事情.由于这个问题已经太长,所以缺少大量代码.

在库中定义:

struct Config
{
    std::string aye;
    std::string bee;
    std::string sea;
};

extern "C" __declspec(dllexport) BridgeBase_I* __stdcall Bridge_GetConfiguredDefaultsImplementationPointer(
    const std::vector<Config> & newConfigs, /**< new configurations to apply **/
    std::string configFolderPath, /**< folder …
Run Code Online (Sandbox Code Playgroud)

.net c++ memory-management c++-cli access-violation

8
推荐指数
2
解决办法
1186
查看次数

C ++ OpenCV 2.4.11:列出所有摄像机

我想使用C ++,OpenCV 2.4.11,Windows 8.1和Qt Creator 3.4.2列出所有连接的网络摄像头(USB网络摄像头和内部网络摄像头)。对我而言,通过以下方式获取可访问的网络摄像头数量就足够了:

VideoCapture videoCapture(0); // Will access my internal laptop webcam.
VideoCapture videoCapture(1); // Will access the first connected usb webcam.
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

// Following procedure detects, how many webcams are accessible from 0 on upwards.
numberOfDevices = 0;
bool noError = true;

while (noError)
{
    try
    {
        // Check if camera is available.
        VideoCapture videoCapture(numberOfDevices); // Will crash if not available, hence try/catch.

        // ...
    }
    catch (...)
    {
        noError = false;
    }

    // If above …
Run Code Online (Sandbox Code Playgroud)

c++ webcam opencv video-capture

6
推荐指数
1
解决办法
2万
查看次数

可预测的Windows中崩溃进程的退出代码

对于在Windows中正常退出的进程,进程的退出代码通常是返回值main,或者传递给退出代码std::exit.%ERRORLEVEL%然后可用于查询退出代码,并且可用于确定程序是否正确执行,或者是否存在指示特定问题的特殊输入/故障(特定于应用程序).

但是,如果进程崩溃,我对退出代码感兴趣.举一个非常简单的示例程序:

int main()
{
    int * a = nullptr;
    *a = 0xBAD;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译并在Windows中运行时,在命令行上我得到:

MyCrashProgram.exe -> crashes
echo %ERRORLEVEL%  -> -1073741819
Run Code Online (Sandbox Code Playgroud)

退出代码始终为此数字.这引出了几个问题:

  • -1073741819基于无效的写入崩溃,退出代码是否可以预测?
  • 如果是这样,有没有办法根据退出代码确定崩溃的类型?
  • 这是否随使用的编译器而改变(我使用的是MSVC 2012)?
  • 这是否随使用的Windows版本而改变(我使用的是Win10 TP)?
  • 这是否随体系结构而变化(例如x64 - 我使用的是Win32)?

注意,我对如何修改程序以捕获异常不感兴趣.我有兴趣对可能在现有程序中发生的崩溃进行分类,我可能无法对其进行修改.

c++ windows crash exit-code

5
推荐指数
1
解决办法
3033
查看次数

在Linux/GCC下将NULL指针访问转换为C++异常

有没有办法将NULL指针访问转换为Linux下的C++异常?类似于Java中的NullPointerException.我希望以下程序能够成功返回,而不是崩溃(假设编译器在编译期间无法找出此NULL指针访问):

class NullPointerException {};

void accessNullPointer(char* ptr) {
    *ptr = 0;
}

int main() {
    try {
        accessNullPointer(0);
    } catch (NullPointerException&) {
        return 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不期望任何标准的方法,因为C++下的NULL指针访问是未定义的 - 行为,只是想知道如何在x86_64 Linux/GCC下完成它.

我做了一些非常原始的研究,有可能:

  1. 当在Linux下访问NULL指针时,将生成SIGSEGV.
  2. 在SIGSEGV处理程序内部,程序的内存和寄存器信息将可用(如果sigaction()用于注册信号处理程序).如果程序被反汇编,也可以使用导致SIGSEGV的指令.
  3. 修改程序的内存和/或注册,并创建/伪造异常实例(可能通过调用低级展开库函数,如_Unwind_RaiseException等)
  4. 最后从信号处理程序返回,希望程序启动一个C++堆栈展开过程就像抛出正常异常一样.

以下是GCC手册页的引用(-fnon-call-exceptions):

生成允许捕获指令以抛出异常的代码.请注意,这需要在任何地方都不存在的特定于平台的运行时支持.此外,它只允许捕获指令抛出异常,即内存引用或浮点指令.它不允许从诸如"SIGALRM"之类的任意信号处理程序抛出异常.

看来这个"特定于平台的运行时"正是我想要的.任何人都知道这样的Linux/x86_64运行时?或者如果没有这样的运行时已经存在,请给我一些关于如何实现这样的运行时的信息?

我希望该解决方案也适用于多线程程序.

c++ linux gcc exception stack-unwinding

5
推荐指数
1
解决办法
417
查看次数

解除引用空指针时是否保证segfault(C/C++)

在下面的C/C++代码中

int * a = malloc(N * sizeof(int)); // suppose return value is NULL
a[2] = 1;
Run Code Online (Sandbox Code Playgroud)

在malloc返回的情况下NULL,我是否保证会发生段错误或行为不可预测?

c c++ null

3
推荐指数
2
解决办法
1958
查看次数