【问题标题】:Catch c++ exception by allocating c memory error通过分配 c 内存错误来捕获 c++ 异常
【发布时间】:2015-01-09 12:28:08
【问题描述】:

我分配一个字符指针来接收数据。当数据太大时,我会收到分段错误(核心转储)。我尝试使用 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;
 }

【问题讨论】:

  • 如果您确实在使用C++ 而不是C,请停止使用mallocchar* 并开始使用string
  • 您设置的内存函数不会更新您在 main 中传递给它的指针。你需要通过char*&amp; p
  • 使用char *strncpy( char *dest, const char *src, std::size_t count ); 定义要复制的字符数(根据您制作的malloc)
  • 如果你需要在函数中改变指针指向的东西,你需要一个指向指针的指针或者一个指针的引用。否则,您在setmemory 中对p 的分配不会影响调用者。
  • 你不能真的希望从中恢复过来。此时放弃并终止进程。

标签: c++ c


【解决方案1】:

通常捕获分段错误是个坏主意,因为您无法保证程序中的任何数据仍然有效。所以不能只截取 SIGSEGV 信号就照常工作。

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

【讨论】:

    【解决方案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.

    【讨论】:

    • 能否举个例子,比如调用信号处理程序?
    • @user3738211 这是在程序运行期间不应发生的错误。从中恢复是没有意义的。你需要修复你的代码,这样一开始就不会发生。
    【解决方案3】:

    您无法在 C++ 中捕获分段错误。段错误是由于程序运行的错误操作导致内存损坏的结果。此时,操作系统已经控制了您的程序。你不想让程序在段错误后继续运行,因为状态不稳定。作为程序员,你需要避免段错误。

    【讨论】:

      【解决方案4】:

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

       void setmemory(char *p, int num)
       {
           p=(char*)malloc(num);
       }
      
        int main()
        {
          char* str = NULL;
          setmemory(str,1);
          //...
          strcpy(str,"hello");
      

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

      正确的方法是:

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 1970-01-01
        • 2011-01-02
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多