我最近遇到了 this rant .
文中提到的几点我不是很明白:
- 作者提到了
delete
与delete[]
的小烦恼,但似乎认为这实际上是必要的(对于编译器),但从未提供解决方案.我错过了什么吗? 在“专用分配器”部分的函数
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
?根据需要发明语法 - 什么是理想,只是为了帮助我更好地理解这些问题。
最佳答案
好吧,理想的可能是不需要任何类型的删除。有一个垃圾收集环境,让程序员避免整个问题。
咆哮中的提示似乎归结为
- “我喜欢 malloc 的处理方式”
- “我不喜欢被迫显式创建已知类型的对象”
关于您必须同时实现 new
和 new[]
这个烦人的事实,他是对的,但是由于 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/