另外一个问题启发了以下想法: std::vector<T>在增加容量时必须移动所有元素吗? 据我所知,标准的行为是为底层的分配器请求新的大小的整个块,然后移动所有旧的元素,然后销毁旧的元素,然后释放旧的内存。 这种行为似乎是给定标准分配器接口的唯一可能的正确解决scheme。 但是我想知道,修改allocator来提供一个reallocate(std::size_t)函数会返回一个pair<pointer, bool>并且可以映射到底层的realloc()吗? 这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不会有任何移动。 布尔值将指示内存是否已移动。 ( std::realloc()可能不是最好的select,因为如果我们不能扩展,我们不需要复制数据,所以实际上我们想要的东西就像extend_or_malloc_new() 。 编辑:也许是一个is_pod -trait-基于规则的专业化将允许我们使用实际的realloc ,包括它的按位副本,只是不一般。) 这似乎是一个错过的机会。 最糟糕的情况是,你总是可以实现reallocate(size_t n)作为return make_pair(allocate(n), true); ,所以不会有任何处罚。 是否有任何问题,使这个function不适合或不适合的C + +? 也许唯一可以利用这个的容器是std::vector ,但是这又是一个相当有用的容器。 更新:一个小例子来澄清。 当前resize() : pointer p = alloc.allocate(new_size); for (size_t i = 0; i != old_size; ++i) { alloc.construct(p + i, T(std::move(buf[i]))) alloc.destroy(buf[i]); } for (size_t i = old_size; i < […]
我怎样才能重新realloc在C + +? 这似乎是缺less的语言 – 有new和delete但不能resize ! 我需要它,因为随着我的程序读取更多的数据,我需要重新分配缓冲区来保存它。 我不认为delete旧的指针和new更大的指针是正确的select。
malloc(0)返回什么? 答案是一样的realloc(malloc(0),0) ? #include<stdio.h> #include<malloc.h> int main() { printf("%p\n", malloc(0)); printf("%p\n", realloc(malloc(0), 0)); return 0; } 从linux gcc输出: manav@manav-workstation:~$ gcc -Wall mal.c manav@manav-workstation:~$ ./a.out 0x9363008 (nil) manav@manav-workstation:~$ 输出保持每次malloc(0) 。 这是一个标准答案吗? 除了学术研究之外,为什么有人有兴趣得到这样一个指针呢? 编辑: 如果malloc(0)返回虚拟指针,那么如何工作: int main() { void *ptr = malloc(0); printf("%p\n", realloc(ptr, 1024)); return 0; } 编辑: 以下代码为每个迭代输出“可能”。 为什么它不会失败? #include<stdio.h> #include<malloc.h> int main() { int […]