在 std 库中抛出错误的 alloc 时禁用中止调用

Disable abort call when throwing bad alloc in std library

提问人:tairqammar 提问时间:4/8/2022 最后编辑:tairqammar 更新时间:4/8/2022 访问量:168

问:

我正在尝试编写一个自定义分配器,以便为仅在发生 OOM 时执行的分支获得更好的代码覆盖率。我设法编写了分配器,但是当在 std 的类中的调试中抛出bad_alloc时,会进行内部调用以中止。此行为仅在调试时出现,在发布时我可以运行测试。

有没有办法在调试配置上禁用此行为?

更新 #1

这是发生上述问题的代码片段。我还忘了提到我使用 MSVC。

#include <iostream>
#include <string>

bool throw_bad_alloc = false;

void* operator new(size_t size)
{
    if (throw_bad_alloc)
        throw std::bad_alloc();
    return ::malloc(size);
}

void operator delete(void* ptr)
{
    ::free(ptr);
}

int main()
{
    try {
        throw_bad_alloc = true;
        std::string name;
        name = "test_string";
    }
    catch (...)
    {
        std::cout << "thrown";
        return 0;
    }
    std::cout << "not thrown";

    return 0;
}

C visual-c++ 内存管理 malloc new-operator

评论

1赞 Some programmer dude 4/8/2022
std::abort 通常作为 std::terminate 的一部分调用。在未处理异常时调用。如何处理异常,更具体地说是异常?std::terminatestd::bad_alloc
0赞 tairqammar 4/8/2022
test 函数包装在 try-catch 块中。在发布时,所有测试都会运行,在每个函数中都会多次抛出,问题仅在调试时出现。std::bad_alloc

答: 暂无答案