C ++中包含的C标准库函数抛出异常吗?

时间:2015-03-08 11:30:01

标签: c++ exception exception-safety exception-safe c-standard-library

在下面的代码中,作者指出new operator函数调用可能会导致异常,因此该实现不是异常安全的,因为对象状态已在第一行中更改。

String &String::operator =( const char *str ) {
    // state is changed
    delete [] s_;                                        

    if( !str ) str = "";

    // exception might occur because of new operator
    s_ = strcpy( new char[ strlen(str)+1 ], str );

    return *this;
}

在阅读时,我想知道C库函数会在C ++中引发异常吗?我知道C中没有例外,但由于我们使用的是C ++编译器,因此可能存在例外情况。

那么,我们可以将c标准lib函数视为异常安全函数调用吗?

谢谢。

顺便说一句,对于记录,实现上述功能的正确方法(异常安全)如下。

String &String::operator =( const char *str ) {
    if( !str ) str = "";
    char *tmp = strcpy( new char[ strlen(str)+1 ], str );
    delete [] s_;
    s_ = tmp;
    return *this;
}

3 个答案:

答案 0 :(得分:4)

  

在阅读时,我想知道C库函数是否会抛出异常   在C ++中?

如果您正确使用这些功能,则不会。他们怎么样?这将彻底破坏向后兼容性。

但是,如果您使用不正确,则会出现未定义的行为。在这种情况下,编译器可以做任何想做的事情,包括抛出异常。

例如,根据C ++语言标准,使用以下显示未定义行为的程序:

#include <iostream>
#include <string.h>

int main()
{
    try
    {
        strcpy(nullptr, nullptr);
    }
    catch (...)
    {
        std::cerr << "exception\n";
    }
}

使用Structured Exception Handling使用Visual C ++ 2013进行编译,如下所示:

cl /nologo /Za /EHa /W4 stackoverflow.cpp

该计划的结果:

exception

答案 1 :(得分:3)

一般来说,C ++标准不会修改C标准中的任何函数,除非判断标识符应该引用实际函数而不是宏。因此,C标准库中的函数不能在C标准规定函数可以执行的任何情况下抛出异常。

允许例外的漏洞包括未定义的行为或回调(例如将比较器传递给引发异常的qsort ......虽然我实际上并不确定是否允许这样做C ++标准)。我并不认为图书馆提供商特别有可能会尝试在存在未定义行为的情况下添加抛出异常的功能。

答案 2 :(得分:0)

不 - 只是因为使用C ++编译器进行编译并不意味着会抛出异常。 C不支持异常,因此C程序不能抛出任何异常。