我想使用 realloc 来增加内存大小,同时保持指针不变(因为调用者使用它)。 realloc 并不总是这样做;有时它会返回一个不同的指针并释放旧指针。我想“尝试”重新分配内存,如果不可能,则回退到使用原始指针的不同方法 - 但 realloc 已经破坏了它!
有没有办法在不可能的情况下尝试增加 malloc 的内存而不破坏(如 realloc 所做的那样)旧指针?
例如
void *pold;
void *pnew = realloc(pold, newsize);
if (pnew != pold)
{
free(pnew);
DoDifferently(pold); // but pold is freed already
}
附言我不关心可移植性(仅限 Linux,因此是标签)。
最佳答案
您应该从您正在使用的 libc 中查看 realloc() 的源代码。从那里,应该很容易看出当它可以就地增加大小时所遵循的路径,以及将返回新指针的其他情况。然后,使用它编写您自己的 tryrealloc() 函数。
例如,这是来自 uclibc 的 realloc() 源代码:http://cristi.indefero.net/p/uClibc-cristi/source/tree/nptl/libc/stdlib/malloc/realloc.c
24 void *
25 realloc (void *mem, size_t new_size)
26 {
...
57 if (new_size > size)
58 /* Grow the block. */
59 {
60 size_t extra = new_size - size;
61
62 __heap_lock (&__malloc_heap_lock);
63 extra = __heap_alloc_at (&__malloc_heap, base_mem + size, extra);
64 __heap_unlock (&__malloc_heap_lock);
65
66 if (extra)
67 /* Record the changed size. */
68 MALLOC_SET_SIZE (base_mem, size + extra);
69 else
70 /* Our attempts to extend MEM in place failed, just
71 allocate-and-copy. */
72 {
73 void *new_mem = malloc (new_size - MALLOC_HEADER_SIZE);
74 if (new_mem)
75 {
76 memcpy (new_mem, mem, size - MALLOC_HEADER_SIZE);
77 free (mem);
78 }
79 mem = new_mem;
80 }
81 }
...
为了清楚起见,我删除了一些部分。但是你可以看到,在第 66 行,它检查是否可以简单地增加当前指针的内存。这是您要保留的部分。从第 69 行开始的 else 情况是处理旧内存将被释放并返回新指针的情况。这是您要踢出并以不同方式处理的部分。从你所说的来看,我猜你只想删除第 77 行,它是免费的。
如果您这样做,请记住您必须手动释放旧指针或新指针,因为两者现在都有效(并且您不希望内存泄漏)。
此外,这是针对 uclibc 的。如果您已经在使用不同的 libc,您应该将新的 tryrealloc() 函数基于该 libc 的 realloc() 函数。
编辑:如果您使用这种方法,您必须小心。您的解决方案将基于内存管理器的内部结构,因此各种 libc 实现之间以及同一 libc 的不同版本之间的情况可能会发生变化和不同。因此,请牢记适当的注意和警告。
关于c++ - 重新分配而不释放旧内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13936669/
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候