try {
int* p = 0;
*p = 1;
} catch (...) {
cout << "null pointer." << endl;
}
Run Code Online (Sandbox Code Playgroud)
我试图抓住这样的例外,但它没有用,有什么帮助吗?
我有一个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) 我想使用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) 对于在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基于无效的写入崩溃,退出代码是否可以预测?注意,我对如何修改程序以捕获异常不感兴趣.我有兴趣对可能在现有程序中发生的崩溃进行分类,我可能无法对其进行修改.
有没有办法将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下完成它.
我做了一些非常原始的研究,有可能:
sigaction()用于注册信号处理程序).如果程序被反汇编,也可以使用导致SIGSEGV的指令.以下是GCC手册页的引用(-fnon-call-exceptions):
生成允许捕获指令以抛出异常的代码.请注意,这需要在任何地方都不存在的特定于平台的运行时支持.此外,它只允许捕获指令抛出异常,即内存引用或浮点指令.它不允许从诸如"SIGALRM"之类的任意信号处理程序抛出异常.
看来这个"特定于平台的运行时"正是我想要的.任何人都知道这样的Linux/x86_64运行时?或者如果没有这样的运行时已经存在,请给我一些关于如何实现这样的运行时的信息?
我希望该解决方案也适用于多线程程序.
在下面的C/C++代码中
int * a = malloc(N * sizeof(int)); // suppose return value is NULL
a[2] = 1;
Run Code Online (Sandbox Code Playgroud)
在malloc返回的情况下NULL,我是否保证会发生段错误或行为不可预测?