【发布时间】:2021-09-13 13:31:21
【问题描述】:
正如标题所说,我知道在 new/delete 系列运算符中没有与 C 的 realloc 等效。
我已经找到了this 的问题,该问题略微涉及该主题,但并没有真正回答“为什么”。
我的问题是:
- 为什么能够重新分配对象是个坏主意?
- 为什么改变对象的大小是个坏主意? (实现集合似乎是对象更改其大小的完全正当理由。)
- 在这些情况下会违反什么规则,为什么这条规则客观上是好的?
【问题讨论】:
-
如果你需要重新分配一个“数组”,你可能会寻找
std::vector,所以不需要明确的realloc。 -
最接近的等价物是使用placement new
-
猜猜? C++ 是关于确定性构造和破坏的。如果确实存在像
realloc这样的表达式......它就不是确定性的。它可能只是创建新对象……或者它可能会破坏一些现有的对象……或者它可能会破坏整个现有缓冲区并重新初始化一个新对象。那是……嗯。使用库组件比使用核心语言部分(恕我直言)更好。 -
reallocfornew[]可能是合理的,但这不会改变对象的大小,只会改变分配对象的数量。但这已经被std::vector覆盖了。reallocfornew完全没有意义。对象的大小是编译时常量。 PS:我不认为placement new 是等价的,因为它没有重新分配。它只是在已分配的内存中调用构造函数。 -
@StoryTeller-UnslanderMonica “C++ 是关于确定性的……” 在 UB 中紧张地吹口哨
标签: c++ memory memory-management