任何人都可以总结出正确的用法是realloc()什么?
realloc()失败后你会怎么做?
从我到目前为止所看到的情况看来,如果realloc()失败,你必须使用free()旧指针.真的吗?
这是一个例子:
1. char *ptr = malloc(sizeof(*ptr) * 50);
2. ...
3. char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60);
4. if (!new_ptr) {
5. free(ptr);
6. return NULL;
7. }
Run Code Online (Sandbox Code Playgroud)
假设在线realloc()失败3.我做就行了正确的事情5由free()荷兰国际集团ptr?
std::realloc如果malloc内存包含非pod类型,则在c ++中是危险的.似乎唯一的问题是,std::realloc如果不能在原位增长记忆,就不会调用类型析构函数.
一个微不足道的工作将是一个try_realloc功能.如果它不能在原地生长,而不是malloc'ing新的记忆,它将简单地返回false.在这种情况下,可以分配新内存,将对象复制(或移动)到新内存,最后释放旧内存.
这看起来非常有用. std::vector可以充分利用这一点,可能避免所有副本/重新分配.
抢先阻燃:从技术上讲,这与Big-O性能相同,但如果矢量增长是您应用中的瓶颈,即使Big-O保持不变,x2加速也很好.
但是,我找不到任何有效的c api try_realloc.
我错过了什么吗?是try_realloc不是像我想象的那么有用吗?是否存在一些try_realloc无法使用的隐藏错误?
更好的是,是否有一些记录较少的API表现得如此try_realloc?
注意:我很明显,在这里的库/平台特定代码中.我并不担心try_realloc本来就是一种优化.
更新:
继Steve Jessops评论是否vector使用realloc更有效率后,我写了一个概念验证来测试.该realloc-vector模拟载体的增长模式,但有realloc的替代选项.我在程序中运行了一百万个元素.
为了比较,vector必须分配19次,同时增加到一百万个元素.
结果,如果realloc-vector是唯一使用堆的结果是令人敬畏的,3-4分配同时增长到百万字节的大小.
如果将realloc-vector其与vector66%的速度一起使用,realloc-vector 那么结果的速度就不那么大了,在增长期间分配8-10次.
最后,如果realloc-vector与以vector相同速率增长的a一起使用,则realloc-vector分配17-18次.在标准向量行为上仅保留一个分配.
我不怀疑黑客可以通过游戏分配大小来提高节省,但我同意Steve的观点,即编写和维护这样一个分配器所付出的巨大努力并不适用.
前段时间我的一位朋友告诉我不要使用realloc,因为它不安全,但他不能告诉我为什么,所以我对这个问题进行了一些研究,最接近我怀疑的是:
https://buildsecurityin.us -cert.gov/bsi/articles/knowledge/coding/809-BSI.html
http://www.iso-9899.info/wiki/Why_not_realloc
我想知道我是否可以继续在我的代码中使用realloc或者如果它是不安全有没有其他方法来重新分配内存?感谢您的关注.
虽然有很多不同的复杂的实现中malloc/ free的C/C++,我在寻找一个非常简单的和(特别是)小一个在一个固定大小的缓冲区和支持工作realloc.不需要螺纹安全等,并且我的物体很小并且尺寸变化不大.有没有可以推荐的实施方案?
编辑:
我将使用该实现在接收器处的通信缓冲区来传输具有可变大小的对象(接收器未知).分配的对象不会长寿,但可能同时使用多个对象.
由于每个人似乎都推荐标准的malloc,我或许应该重新提出我的问题.我需要的是在缓冲区之上的"最简单"的malloc实现,我可以根据自己的需要开始优化.也许最初的问题不清楚,因为我不是在寻找一个优化的malloc,只是为了一个简单的.我不想从一个glibc-malloc开始并扩展它,但是它的重量轻.
我在以下代码中收到无效的内存错误:
printf(" %s\n","FINE 5");
printf("%s LENGTH IS: %d\n","FINE 6",strlen(": "));
buffer = (char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char));
printf(" %s\n","FINE 7");
strcat(buffer, ": \0");
Run Code Online (Sandbox Code Playgroud)
输出:
FINE 5
FINE 6 LENGTH IS:
检测到 2 *glibc* ./auto:realloc():下一个大小无效:0x08cd72e0***======= Backtrace:=========/lib/tls /i686/cmov/libc.so.6(+0x6b591)[0x6dd591]
这里需要注意的Fine 7是从未打印过.每次运行时无效的下一个大小错误位于同一位置.
发现这种相关性
我克隆了一个大型仓库并出现错误(经过多次尝试)
克隆成功,但结账失败
试图解决这个问题时
git checkout -f HEAD
Run Code Online (Sandbox Code Playgroud)
一个错误回来了
致命:内存不足,realloc失败2
我已经设置了一些内存限制,因为克隆也会因设置而遇到问题
git config pack.WindowMemory 256m && git config pack.packSizelimit 256m
Run Code Online (Sandbox Code Playgroud)
根据Punit Vara(下面)的建议,我还将.git/config编辑为:
[core]
packedGitLimit = 128m
packedGitWindowSize = 128m
[pack]
deltaCacheSize = 128m
packSizeLimit = 128m
windowMemory = 128m
Run Code Online (Sandbox Code Playgroud)
我已经尝试将这些值更改为:128m,256m,512m,1024m.这不适合我.我仍然得到相同的错误,似乎出现在41%.
任何人都有这方面的经验或任何想法出错和/或可以做些什么来解决这个问题?谢谢.
realloc如何知道原始数据的大小?
void *realloc(void *ptr, size_t size);
Run Code Online (Sandbox Code Playgroud)
所以,如果实现是这样的:
temp = malloc(size);
memcpy(.. // How much to copy?
free(ptr);
return temp;
Run Code Online (Sandbox Code Playgroud)
我意识到这不是最初的实现,并且realloc并不总是免费,但是当它发生时,它复制了多少?
编辑:谢谢你的回答.但是,如何在我的代码中使用malloc/free/..实现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++分配系统而不是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) 每个人都知道:
realloc 调整现有内存块的大小或将其复制到更大的块.calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.为什么C标准没有提供如下结合上述两者的功能?
void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)
调整大型哈希表或自定义内存池的大小不是很有用吗?