c++ - 为什么语言中内置了非放置 `new` 和 `delete` 而不仅仅是常规函数?

标签 c++ new-operator delete-operator

为什么没有展示 new expressiondelete expression实现为语言内置而不是常规函数?

如果我们有...

  • 向操作系统请求/归还内存的一种方式

  • 一种显式调用构造函数的方式(placement new)

  • 一种显式调用析构函数的方式(~T())

...为什么非放置 newdelete 不能只是标准库中的常规函数​​?示例:

template <typename T, typename... Ts>
T* library_new(Ts&&... xs)
{
    auto* ptr = /* request enough memory for `T` from OS */;
    new (ptr) T(std::forward<Ts>(xs)...);
    return ptr;
}

template <typename T>
void library_delete(T* ptr)
{
    ptr->~T();
    /* reclaim memory for `T` from OS */
} 

最佳答案

如果用户的目标是在某个内存位置创建一个对象,那么 new 似乎是一种自然的方法,因为 转发引用可变参数模板placement new 在那个时候已经不是什么东西了。正如 @T.C. 正确指出的那样模板于 1990 年发布,并于 1989 年发布。另一方面,可变参数模板仅在 C++11 中成为 C++ 的一部分。

tl;dr 没有办法将一堆参数转发给任意类型的构造函数(就像现在使用 make 函数一样)。

关于c++ - 为什么语言中内置了非放置 `new` 和 `delete` 而不仅仅是常规函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44969892/

相关文章:

c++ - 为什么变量不变?

c++ - htmlcxx API 用法

c++ - 为什么删除 void* 是 UB 而不是编译错误?

c++ - 私有(private)运算符删除会触发 GCC 和 Clang 的编译时错误,但不会触发 MSVC

c++ - 为什么要在实例替换 vector 中删除?

c++ - 如何在另一个类构造函数中使用一个类的成员

c++ - 初学者数组的问题,C++

c++ - C++ 中的动态内存分配需要新的运算符吗?

c# - 命名空间 'SharePoint' 在命名空间 'Microsoft' 中不存在