顺序栈【进栈算法-扩容】Bug

longyue0521 发表于2017年09月27日
<p><img src="https://nos.netease.com/edu-image/ba259266-ccf7-4fc3-a415-e088cc9fd808.png" /></p><p><br /></p><p><code class="brush:cpp;toolbar:false" >//&nbsp;newbase不为NULL时,有两种情况: //&nbsp;1)在S.base后面直接增加长度为STACKINCREMENT的内存空间,此时S.base&nbsp;==&nbsp;newbase //&nbsp;&nbsp;&nbsp;&nbsp;free(S.base)后newbase就是迷途指针 //&nbsp;2)S.base后无法增加空间,另找一块长度为(S.stacksize+STACKINCREMENT)的空间并将原数据拷贝到该空间 //&nbsp;&nbsp;&nbsp;&nbsp;S.base&nbsp;!=&nbsp;newbase //&nbsp;综上,free(S.base)前应该做如下判断: if(&nbsp;S.base&nbsp;!=&nbsp;newbase)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;free(S.base) }</code></p>
3 回复

    1楼

  • 计算机-1602-周华田 发表于2017年09月28日
    2 | 0 | 举报
    <p><a href="https://en.cppreference.com/w/c/memory/realloc" target="_blank" >cppreference - realloc</a><br ></p><p>两种写法都是错的:realloc(ptr,size) 的 ptr 在 realloc() 成功之后就已经无效了,无论是不是就地重新分配。不需要 free()。</p><p>除非realloc()失败了。这种情况下,realloc(ptr,size)的ptr仍然需要被 free()。</p><p>对成功的 realloc(ptr,size) 的 ptr 的任何操作都是未定义行为。</p>
    计算机-1602-周华田 发表于2017年09月28日
    添加评论
  • 2楼

  • longyue0521 发表于2017年09月28日
    5 | 2 | 举报
    <p>@华科CS1602周华田 感谢指正!<br >作如下验证:<br ><img src="https://nos.netease.com/edu-image/11f781f9-7158-44aa-aeaa-fbe3873d8d8f.png" style="width: 512px; height: 452px;" /></p><p><strong><br />1)验证realloc就地添加与重新分配后原指针与返回的新指针的关系</strong>:<br /><img src="https://nos.netease.com/edu-image/d58c7440-4730-412b-80de-98e46bd821f4.png" style="width: 511px; height: 116px;" /></p><p>结果表明:<br />指针x在realloc后x指向的内存被释放了,rx指向了新的内存区域;(重新分配,两者不相同)<br />指针y在realloc后其指向的内存没有被释放,ry与y具有相同的值;(就地添加,两者相同)<br /><br /></p><p><strong>2)验证realloc在重新分配成功后是否将旧内存释放:(去掉if(x != rx) free(x);注释后)</strong></p><p><img src="https://nos.netease.com/edu-image/df41f1ec-0ce0-439a-953f-0294c4abdc76.png" style="width: 658px; height: 105px;" /></p><p>结果表明,当realloc重新分配(非就地添加)内存空间成功时,realloc会释放原指针指向的内存空间。<br /><br /></p><p>综上,<span style="text-decoration: underline;" >realloc后不要再使用原指针,应使用realloc返回的新指针(可以在realloc后将原指针重置为NULL)。</span><br >课件中代码<strong>应该将free(S.base);去掉</strong></p>
    longyue0521 发表于2017年09月28日
    添加评论
  • 3楼

  • 计算机-1602-周华田 发表于2017年10月09日
    1 | 0 | 举报
    <p>还行 其实我自己也去试过</p><p>但是在我自己电脑的 libc 实现上,一块 malloc() 的空间需要 free() 8次左右才会导致 double free。</p><p>所以我就没有发截图(</p><p>(所以说标准库的 allocator 真的很……</p><p>// -------------------------------------------</p><p>我电脑的环境</p><p>Linux kernel 4.13.4</p><p>glibc 2.26-4<br ></p><p>gcc-multilib 7.1.1-3</p><p>gcc-libs-multilib 7.1.1-3</p>
    计算机-1602-周华田 发表于2017年10月09日
    添加评论