标签: realloc

如果新的尺寸更小,可以realloc移动指针吗?

我想知道当使用较小(非零)大小调用realloc时,C或C++标准是否保证指针不会更改:

size_t n=1000;
T*ptr=(T*)malloc(n*sizeof(T));
//<--do something useful (that won't touch/reallocate ptr of course)
size_t n2=100;//or any value in [1,n-1]
T*ptr2=(T*)realloc(ptr,n2*sizeof(T));
//<-- are we guaranteed that ptr2==ptr ?
Run Code Online (Sandbox Code Playgroud)

基本上,操作系统可以自行决定,因为我们释放了大量内存块,他想利用所有realloc来对内存进行碎片整理,并以某种方式移动ptr2?

c realloc

11
推荐指数
4
解决办法
4633
查看次数

替换realloc(C - > C++)

在之前的一个问题中,我询问了类型转换指针,但是针对使用C++分配系统而不是mallocs的更好解决方案.(我正在将一些C代码转换为C++)

但是,我仍然遇到类似功能的问题:

我变了:

tmp = malloc(sizeof(char*) * mtmp); --> tmp = new char*[mtmp];
Run Code Online (Sandbox Code Playgroud)

free(tmp) --> delete [] tmp;
Run Code Online (Sandbox Code Playgroud)

但是,我在以下函数中如何处理realloc:

char* space_getRndPlanet (void)
{
   int i,j;
   char **tmp;
   int ntmp;
   int mtmp;
   char *res;

   ntmp = 0;
   mtmp = CHUNK_SIZE;
   //tmp = malloc(sizeof(char*) * mtmp); <-- replaced with line below
   tmp = new char*[mtmp];
   for (i=0; i<systems_nstack; i++)
      for (j=0; j<systems_stack[i].nplanets; j++) {
         if(systems_stack[i].planets[j]->real == ASSET_REAL) {
            ntmp++;
            if (ntmp > mtmp) { /* need more space */
               mtmp += …
Run Code Online (Sandbox Code Playgroud)

c c++ void-pointers realloc

11
推荐指数
3
解决办法
9703
查看次数

为什么C标准中没有"recalloc"?

每个人都知道:

  • realloc 调整现有内存块的大小或将其复制到更大的块.
  • calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.

为什么C标准没有提供如下结合上述两者的功能?

void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)

调整大型哈希表或自定义内存池的大小不是很有用吗?

c malloc allocation realloc calloc

11
推荐指数
2
解决办法
3659
查看次数

是真的,当调用realloc时,现代操作系统可能会跳过副本

在阅读/sf/answers/223334261/时,我有一个问题.Qt作者在Qt 4容器内部所说的内容:

... QVector使用realloc()以4096字节的增量增长.这是有道理的,因为现代操作系统在重新分配缓冲区时不会复制整个数据; 物理内存页面只需重新排序,只需要复制第一页和最后一页上的数据.

我的问题是:

1)现代操作系统(Linux - 对我来说最有趣; FreeBSD,OSX,Windows)及其realloc实现是否真的能够使用虚拟到物理映射的重新排序重新分配数据页面并且无需逐字节复制?

2)用于实现此内存移动的系统调用是什么?(我认为可以splice使用SPLICE_F_MOVE,但它现在有缺陷且没有操作(?))

3)它是有利可图使用这些页面重排,而不是逐字节复制,尤其是在多核多线程的世界里,虚拟到物理映射的每一个变化需要刷新(无效)改变从页表项TLB中的所有特殊数十个CPU核心与IPI?(在linux中,这就像是flush_tlb_range或者flush_tlb_page)

upd for q3:mremap vs memcpy的一些测试

memory-management realloc linux-kernel

10
推荐指数
1
解决办法
1281
查看次数

由C11 aligned_alloc分配的内存重新分配是否保持对齐?

考虑以下(C11)代码:

void *ptr = aligned_alloc(4096, 4096);
... // do something with 'ptr'
ptr = realloc(ptr, 6000);
Run Code Online (Sandbox Code Playgroud)

由于ptr指向的内存具有4096字节的对齐aligned_alloc,是否(读取:是否保证)在(成功)调用之后保持该对齐realloc?或者内存可以恢复为默认对齐?

c memory-management realloc c11

10
推荐指数
1
解决办法
1283
查看次数

realloc失败的几率是多少?

当它的可用内存耗尽时是否会失败malloc?或者是否有其他原因?

c memory-management realloc

9
推荐指数
3
解决办法
5248
查看次数

结构中的数组和结构的Malloc

如何将malloc放在另一个结构体内?

我还想在结构中malloc一个项目数组,然后在需要时重新分配这个数组,这是如何正确完成的?

你能举个例子来说明一个结构,然后是上面的结构.

我有点不确定事情的顺序.

结构中的数组是否会被释放,然后结构本身,结构在创建时是否必须被malloced,然后它的字段被malloced /声明等?

c malloc struct realloc

9
推荐指数
1
解决办法
3万
查看次数

realloc()在嵌入式系统中是否安全?

在为嵌入式系统开发软件时,我realloc()多次使用了函数.现在我被告知我"不应该realloc()在嵌入式中使用"而没有任何解释.

realloc()嵌入式系统是危险的,为什么?

c embedded memory-management realloc

9
推荐指数
2
解决办法
2089
查看次数

如果allocator提供realloc语义,std :: vector可以避免复制吗?

我有一个内存接口,分离出获取地址空间与附加后备存储.(在Linux下,接口管理的地址空间池是mmap'ed MAP_ANONYMOUS和MAP_NORESERVE,madvise'ed MADV_DONTNEED和mprotect'ed PROT_NONE.然后通过madvise MADV_WILLNEED和mprotect PROT_READ,PROT_WRITE和PROT_EXEC附加支持.)

这个界面允许我分配大量的地址空间,同时懒洋洋地获取实际的物理内存.我想用它来创建一个"懒惰的向量",它在适当的点上提出后备存储请求,但是当它增长时从不复制向量的当前内容.

鉴于标准库的分配器的语义是这样的方案可能吗?感激地接受指针,提示或其他指导.

c++ stl vector realloc allocator

9
推荐指数
1
解决办法
363
查看次数

可以使用realloc安全地重新分配普通可复制对象的存储吗?

我知道可以安全地将简单的可复制对象复制malloc到适当的存储位置1,并且目标对象将具有与源相同的值.

这也可能realloc吗?也就是说,如果realloc某个存储包含某些类型的对象T,并realloc决定移动并复制该块,新分配的存储中的对象是否完整并且已经开始其生命周期,并且旧存储中的对象的生命周期将是安全的结束了?


1在提出这个问题时,我曾假设"适当的存储位置"包括适当对齐和大小的未初始化存储,但正如MM的答案所述,这并不是标准所支持的.这会让人realloc怀疑,因为它总是复制到未初始化的存储中.

c++ realloc object-lifetime language-lawyer c++11

8
推荐指数
1
解决办法
216
查看次数