我怎么能用reallocC++?它似乎在语言中缺失 - 有new,delete但不是resize!
我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它.我不认为delete旧指针和new新的更大的指针是正确的选择.
什么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;
}
Run Code Online (Sandbox Code Playgroud)
linux gcc的输出:
manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
Run Code Online (Sandbox Code Playgroud)
输出每次都在变化malloc(0).这是标准答案吗?除了学术研究之外,为什么有人会对获得这样的指针感兴趣?
编辑:
如果malloc(0)返回虚拟指针,那么后续工作原理如何:
int main()
{
void *ptr = malloc(0);
printf("%p\n", realloc(ptr, 1024));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下代码为每次迭代输出"可能".为什么不失败?
#include<stdio.h>
#include<malloc.h>
int main()
{
int i;
void *ptr;
printf("Testing using BRUTE FORCE\n");
for (i=0; i<65000; i++)
{
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
printf("Iteration %d: possible\n", …Run Code Online (Sandbox Code Playgroud) 一个不同的问题启发了以下思想:
在增加容量时是否std::vector<T> 必须移动所有元素?
据我所知,标准行为是底层分配器请求新大小的整个块,然后移动所有旧元素,然后销毁旧元素,然后解除分配旧内存.
在给定标准分配器接口的情况下,此行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个reallocate(std::size_t)可以返回a pair<pointer, bool>并可以映射到底层的函数是否有意义realloc()?这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不需要进行任何移动.布尔值表示内存是否已移动.
(std::realloc()也许不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要类似的东西extend_or_malloc_new().编辑:也许is_pod基于特征的专业化将允许我们使用实际的realloc,包括它的按位副本.只是不一般.)
这似乎错过了机会.最坏的情况下,可以始终贯彻reallocate(size_t n)的return make_pair(allocate(n), true);,所以不会有任何惩罚.
是否有任何问题导致此功能对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 < new_size; ++i)
{
alloc.construct(p + i, T());
}
alloc.deallocate(buf); …Run Code Online (Sandbox Code Playgroud) 我正在将一个项目移植到iPhone上,它使用的realloc并且memcpy没有找到.要包含的标题是什么?
这是一个混合Objective C和C++的项目,我开始迷失方向.
在此先感谢您的帮助!
在C中,标准内存处理函数是malloc(),realloc()和free().但是,C++ stdlib分配器只兼容其中两个:没有重新分配功能.当然,不可能完全相同realloc(),因为简单地复制内存不适合非聚合类型.但是,这个函数是否会出现问题:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
Run Code Online (Sandbox Code Playgroud)
哪里
ptr先前为num_now对象分配了相同的分配器;num_requested> = num_now;和语义如下:
ptr从给定num_now对象的大小扩展给定的内存块num_requested,它会这样做(留下额外的内存未初始化)并返回true;false.当然,这不是很简单,但据我所知,分配器主要用于容器和容器的代码通常很复杂.
给定这样的函数,std::vector比如说,可以增长如下(伪代码):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one …Run Code Online (Sandbox Code Playgroud) 当我们通过重新分配内存时realloc(),先前的内容是否被覆盖?我正在尝试创建一个程序,每次我们输入数据时重新分配内存.
请通过realloc告诉我有关内存分配的信息,例如编译器依赖吗?
我很难理解realloc是如何工作的.如果我malloc'ed缓冲区并将数据复制到该缓冲区,让我们说"AB":
+------------+
| A | B | \0 |
+------------+
Run Code Online (Sandbox Code Playgroud)
然后我重新分配了缓冲区,数据中是否会丢失(甚至是单个字节)?或者只是扩展缓冲区?:
+------------------------+
| A | B | \0 | ? | ? | ? |
+------------------------+
Run Code Online (Sandbox Code Playgroud)
码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void){
char* buffer = (char*) malloc( sizeof(char) * 3 );
strncpy(buffer, "AB", 2);
buffer = (char*) realloc(buffer, sizeof(char) * 6); /* Will there be any lost here? */
free(buffer);
return(0);
}
Run Code Online (Sandbox Code Playgroud) 从什么是写在这里,new分配在自由存储,同时malloc采用堆和这两个术语往往意味着同样的事情.
根据此处的内容,realloc可以将内存块移动到新位置.如果免费存储和堆是两个不同的内存空间,它是否意味着任何问题呢?
具体来说,我想知道它是否安全使用
int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果没有,是否还有其他方式可以安全地realloc分配内存new?我可以分配新的区域和memcpy内容,但据我所知,realloc如果可能的话可以使用相同的区域.
我正在阅读realloc并对那里提到的一点感到困惑.请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
int main () {
int* ptr = NULL;
ptr = realloc(ptr, 10*sizeof(int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
realloc使用最初NULL估值的内存分配内存是否有任何危险ptr?如果不是:
int* ptr = NULL;
Run Code Online (Sandbox Code Playgroud)
我有这个:
int* ptr; // no value given to ptr
Run Code Online (Sandbox Code Playgroud)
打电话realloc使用会有问题ptr吗?
如果realloc失败并且返回NULL,那么前者缓冲区是免费的还是保持原样?我没有在手册页中找到特定的信息,我很不确定该怎么做.如果释放内存,则双重释放可能存在风险.如果不是,则会发生泄漏.