C++中xmalloc的正确类比

Car*_*s00 1 c++

两个简单的问题:简单地说,C我们经常使用xmalloc哪个是分配或中止例程.我用C++实现了它.这是一个正确的无异常实现吗?

template <typename T>
T *xnew(const size_t n)
{
    T *p = new (std::nothrow) T[n];
    if (p == nullptr)
    {
        cerr << "Not enough memory\n";
        abort();
    }
    return p;
}

int main()
{
    int *p = xnew<int>(5000000000LL);
}
Run Code Online (Sandbox Code Playgroud)

第二个问题,如果我<int>从xnew<int>(5000000000LL);调用中删除,编译器(g ++ 4.7.2)不能再推断,[T = int]尽管返回类型int *仍然存在.这是为什么?

编辑:使用new可能抛出异常的版本是否有任何开销,即使它没有被抛出?当我不是绝对必要的时候,我真的不想使用任何例外.

pmr*_*pmr 5

我不明白为什么这是必要的. 如果无法分配内存,new则会抛出 std::bad_alloc如果您不处理异常,这将导致调用std::terminate有效地结束程序并具有与之相同的行为xmalloc.

当然,当编译器没有实现异常时,这会发生变化.