`std :: realloc`用于非POD类型

时间:2015-08-09 15:04:04

标签: c++

对非POD类型使用git rev-list $tag..HEAD --count是否安全?

例如,如果我std::realloc一个STL容器数组,即使移动内容也不会成为问题,因为容器对象的所有成员(包括指向实际数据的指针)仍然存在那里。为每个元素调用复制构造函数是不是浪费,这可能会分配新的堆内存并复制所有内容,然后释放所有旧的内存块。例如,考虑调整realloc的大小。

我错过了什么吗?

注意:当然,您很少在C ++中调用std::vector<std::vector<int>>,但要考虑何时设计涉及调整大小的数据结构类。

2 个答案:

答案 0 :(得分:3)

不,不安全。

对于你想象的更简单的东西,你可以逃脱它。

但想象一下使用类变量来跟踪每个对象位置的结构。现在你用realloc而不是构造函数和赋值运算符复制它,结构完全错误,因为代码违反了规则。

答案 1 :(得分:0)

当要求realloc扩展已分配的区域时,它可以通过两种不同的方式取得成功:

  • realloc可以某种方式扩展该区域,因此它会保留其地址但会变大。只要将新零件视为未初始化的存储空间,这就没有问题了。

  • realloc可以分配合适的新区域,复制数据并解除分配原始区域。 问题1 :复制并不总是适合负责复制或移动的类型。 问题2:指针和对原始区域中对象的引用现在无效。

很容易想到它适用于非POD项目的情况,并且很容易想到它不起作用的情况。对于不工作而言可能是最简单的,链接结构的Node类型,其中节点具有彼此的指针。

结果是人们可以获得真正的速度提升(例如,CPython使用realloc进行字符串处理),但是std::vector太过笼统,无法使用它。需要一些更专用的自定义容器。 AFAIK在Boost中没有这样的东西,但即使我没有听说过它也可能有。