c++ - C++ 'new' 运算符有问题吗?

标签 c++ language-features new-operator allocation

我最近遇到了 this rant .

文中提到的几点我不是很明白:

  • 作者提到了 deletedelete[] 的小烦恼,但似乎认为这实际上是必要的(对于编译器),但从未提供解决方案.我错过了什么吗?
  • 在“专用分配器”部分的函数 f() 中,似乎可以通过将分配替换为:(省略对齐)来解决问题

    // if you're going to the trouble to implement an entire Arena for memory,
    // making an arena_ptr won't be much work. basically the same as an auto_ptr,
    // except that it knows which arena to deallocate from when destructed.
    arena_ptr<char> string(a); string.allocate(80);
    // or: arena_ptr<char> string; string.allocate(a, 80);
    arena_ptr<int> intp(a); intp.allocate();
    // or: arena_ptr<int> intp; intp.allocate(a);
    arena_ptr<foo> fp(a); fp.allocate();
    // or: arena_ptr<foo>; fp.allocate(a);
    // use templates in 'arena.allocate(...)' to determine that foo has
    // a constructor which needs to be called. do something similar
    // for destructors in '~arena_ptr()'.
    
  • 在“Dangers of overloading::operator new[]”中,作者尝试做一个new(p) obj[10]。为什么不这样(更明确):

    obj *p = (obj *)special_malloc(sizeof(obj[10]));
    for(int i = 0; i < 10; ++i, ++p)
        new(p) obj;
    
  • '在 C++ 中调试内存分配'。不能在这里争论。

整篇文章似乎都围绕着具有重要构造函数析构函数的类,这些类位于自定义内存管理方案。虽然这可能很有用,而且我不能反驳它,但它的通用性非常有限。

基本上,我们有放置新分配器和按类分配器——这些方法不能解决哪些问题?

此外,如果我只是胆大妄为且疯狂,在理想的 C++ 中,什么会取代 operator new?根据需要发明语法 - 什么是理想,只是为了帮助我更好地理解这些问题。

最佳答案

好吧,理想的可能是不需要任何类型的删除。有一个垃圾收集环境,让程序员避免整个问题。

咆哮中的提示似乎归结为

  1. “我喜欢 malloc 的处理方式”
  2. “我不喜欢被迫显式创建已知类型的对象”

关于您必须同时实现 newnew[] 这个烦人的事实,他是对的,但是由于 Stroustrups 维护核心的愿望,您被迫这样做C 的语义。由于您无法从数组中分辨出指针,因此您必须自己告诉编译器。你可以解决这个问题,但这样做意味着从根本上改变语言的 C 部分的语义;你不能再使用这个身份

*(a+i) == a[i]

这会破坏所有 C 代码的很大一部分。

所以,你可以有一种语言

  • 实现了一个更复杂的数组概念,并消除了指针算术的奇妙之处,用掺杂 vector 或类似的东西实现了数组。

  • 是垃圾收集器,因此您不需要自己的delete 规则。

也就是说,您可以下载 Java。然后您可以通过更改语言来扩展它

  • 不是强类型,所以类型检查 void * upcast 被消除了,

...但这意味着您可以编写将 Foo 转换为 Bar 的代码,而编译器不会看到它。如果需要,这也将启用 ducktyping。

事情是,一旦你完成了这些事情,你就拥有了带有 C-ish 语法的 Python 或 Ruby。

自从 Stroustrup 发出 cfront 1.0 的磁带以来,我就一直在编写 C++;现在,C++ 的许多历史都源于希望拥有一种适合 C 世界的 OO 语言。大约在同一时间出现了许多其他更令人满意的语言,例如 Eiffel。 C++ 似乎赢了。我怀疑它获胜是因为它可以适应 C 世界。

关于c++ - C++ 'new' 运算符有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/745850/

相关文章:

c++ - g++ 没有 gcc 也能工作吗?

c++ - C++ 最危险的特性是什么?

language-agnostic - 你最喜欢的语言如何处理深度递归?

c++ - 使用 new 运算符静态分配对象

c++ - 新的运算符分配函数顺序连续性和初始值

c++ - 类型名称后的括号是否与 new 有所不同?

c++ - 为什么 setwidth 为其他值 1 会使我的线消失?

c++ - Access .ldb 文件和多重连接。

c++ - 多线程 C++ 点火过程中 std::basicstring 的运行时段错误

regex - 在哪些语言中使用用户提供的正则表达式是一个安全漏洞?