哪一个是在C ++中分配未初始化内存的最惯用方法

时间:2017-09-27 18:49:24

标签: c++ memory malloc new-operator

选项A:

T * address = static_cast<T *>(::operator new(capacity * sizeof(T), std::nothrow));

选项B:

T * address = static_cast<T *>(std::malloc(capacity * sizeof(T)));

上下文:

template <typename T>
T * allocate(size_t const capacity) {
    if (!capacity) {
        throw some_exception;
    }
    //T * address = static_cast<T *>(std::malloc(capacity * sizeof(T)));
    //T * address = static_cast<T *>(::operator new(capacity * sizeof(T), std::nothrow));
    if (!address) {
        throw some_exception;
    }
    return address;
}

std::malloc更短,但::operator new显然是C ++,它可能是以std::malloc来实现的。在C ++中使用哪一个更好/更惯用。

1 个答案:

答案 0 :(得分:2)

如果可能的话,您应该更喜欢以类型安全的方式分配内存。如果那是不可能的,请选择选项A operator new(size_t, std::nothrow),因为:

  • 可以合法地覆盖运算符newdelete(这在自定义分配器/泄漏检测方案中非常有用)。
  • 可以使用替代分配器来处理内存不足(set_new_handler)。
  • 更多是C ++。

选择malloc / free的唯一理由是,如果您希望使用realloc优化重新分配,{{1}不支持} operator / new(realloc是not一个简单的free + malloc)。