通过分配c内存错误来捕获c ++异常

时间:2014-11-12 15:30:47

标签: c++ c

我为接收数据分配了一个char指针。当数据太大时,我会收到分段故障(核心转储)。我尝试使用try catch块来捕获异常以避免这种错误,但仍然显示相同的错误。我怎么抓住这种例外?

#include<iostream>
using namespace std;

void setmemory(char* p, int num)
{
    p=(char*)malloc(num);
}

void test(void)
{
    char* str = NULL;
    setmemory(str,1);
    try{
        strcpy(str,"hello");
        cout << "str:" << str << endl;
    } catch (...) {
        str = NULL;
        cout << "Exception occured!" << endl;
    }
 }

 int main()
 {
    test();
    return 0;
 }

4 个答案:

答案 0 :(得分:2)

您无法通过异常捕获分段错误...异常不是为捕获信号而设计的。对于这些情况,您需要特殊处理,如调用信号处理程序等...

虽然有一种方法可以将这些信号转换为C ++中的异常。以下链接将说明此主题: -

https://code.google.com/p/segvcatch/

此处给出的示例: -

try
{
    *(int*) 0 = 0;
}
catch (std::exception& e)
{
    std::cerr << "Exception catched : " << e.what() << std::endl;
}

无论如何在获得分段错误之后最好去调试而不是继续当前执行,之后再进行transported to realm of undefined behavior.

答案 1 :(得分:2)

通常捕获Segmentation Fault是个坏主意,因为您无法保证程序中的任何数据仍然有效。所以你不能只是拦截SIGSEGV信号,你是否照常工作。

在此处查看更多详情: How to catch segmentation fault in Linux?

答案 2 :(得分:1)

您无法在C ++中捕获Segmentation错误。 seg故障是由于程序运行不良导致内存损坏的结果。此时,操作系统已控制您的程序。由于状态不稳定,您不希望在seg故障后保持程序运行。作为程序员,您需要避免seg故障。

答案 3 :(得分:0)

如果您发布的代码是您的实际代码,即使您分配了足够的空间,您的代码也无法正常运行。

 void setmemory(char *p, int num)
 {
     p=(char*)malloc(num);
 }

  int main()
  {
    char* str = NULL;
    setmemory(str,1);
    //...
    strcpy(str,"hello");

我们可以在那里停下来。您正在尝试将“hello”复制到NULL指针。即使调用了str函数,也没有将setmemory设置为已分配的空间。

执行此操作的正确方法(我将使用malloc,即使我不推荐它)将是:

 void setmemory(char *&p, int num)
 {
     p=(char*)malloc(num);
 }

您需要通过引用传递指针,否则p充当临时变量,因此在函数内设置p将不会传播回调用方。