gpt4 book ai didi

c++ - 在 C++ 异常的 what() 中构建字符串

转载 作者:行者123 更新时间:2023-11-30 01:09:47 24 4
gpt4 key购买 nike

This answer声明一个 private static ostringstream。这个线程安全吗?如果两个线程同时抛出(捕获并记录 what())异常,这是否可靠?如果我在本地声明 ostringstream,例如:

virtual const char* what() const throw()
{
std::ostringstream cnvt.str( "" );
cnvt << runtime_error::what() << ": " << getNumerator()
<< " / " << getDenominator();
return cnvt.str().c_str();
}

是否存在缺陷(内存泄漏,或非法指针)?或者这是线程安全的方式?

最佳答案

没有。它根本不安全(而且对我来说效率很低,可以单独使用 std::string 来完成)。
为了确保安全,将 ostringstream 声明为 thread_local

static thread_local ostringstream cnvt;

此外,您应该使 cnvt 将字符串输出到某个成员字符串,以免返回悬空指针。

class DivideByZeroException: public runtime_error {
public:

DivideByZeroException(int x, int y)
: runtime_error( "division by zero" ), numerator( x ), denominator( y )
{}

virtual const char* what() const throw()
{
cnvt.str( "" );

cnvt << runtime_error::what() << ": " << getNumerator()
<< " / " << getDenominator();

error = cnvt.str();
return error.c_str();
}

/*...*/

private:
std::string error;
int numerator;
int denominator;

static thread_local ostringstream cnvt;
};

此外,如果异常是“除以零”,您不认为存储分母有点傻吗?它始终为零!否则你不会抛出“被零除”错误!

最后 0-division 错误更适合从与数学错误相关的 std::domain_error 派生。

关于c++ - 在 C++ 异常的 what() 中构建字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39449298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com