`
dengbaoleng
  • 浏览: 1133057 次
文章分类
社区版块
存档分类
最新评论

使用new实现realloc操作

 
阅读更多

本文定义了一个宏来实现使用new代替realloc的操作,代码如下:

  1. #include<iostream>
  2. #include<malloc.h>
  3. usingnamespacestd;
  4. //p-内存指针
  5. //n-申请内存数量
  6. //T-申请内存类型
  7. #defineRENEW(p,n,T)/
  8. {/
  9. T*pNew=newT[n];/
  10. memcpy(pNew,p,_msize(p));/
  11. delete[]p;/
  12. p=pNew;/
  13. }
  14. voidmain(void)
  15. {
  16. char*pold=newchar[10];
  17. memset(pold,0,10);
  18. memcpy(pold,"wangliu",7);
  19. RENEW(pold,17,char);
  20. strcat(pold,"qianggood");
  21. cout<<pold<<endl;
  22. delete[]pold;
  23. /*int*pold=newint[5];
  24. for(inti=0;i<5;i++)
  25. {
  26. pold[i]=i;
  27. }
  28. RENEW(pold,10,int);
  29. for(i=5;i<10;i++)
  30. {
  31. pold[i]=i;
  32. }
  33. for(i=0;i<10;i++)
  34. {
  35. cout<<pold[i]<<endl;
  36. }
  37. delete[]pold;*/
  38. }

几个问题:

1. 有了malloc/free为什么还要new/delete?

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete 不是库函数。

2. 上面代码中如果在22行中申请了16长度的内存,则使用delete[]pold;时将出现非法错误,这是由于内存越界造成的,字符串最后面需要'/0'来表示字符串的结尾,所以在第22行应申请17长度的内存。在debug模式下,越界的时候delete会非法操作,但是release模式下不会。因为debug模式下分配内存的时候会多分配4个字节,这4个字节内容是0xFE,delete的时候会检查这4个字节,看是否越界。

分享到:
评论

相关推荐

    realloc函数的使用

    realloc函数的使用在数据结构中十分重要,本文给出了使用的例子和使用的具体说明

    数据结构顺序表 C语言代码实现以及realloc的使用

    数据结构顺序表 C语言代码实现以及realloc的使用

    浅谈malloc,calloc,realloc.pdf

    C中堆管理—浅谈malloc,calloc,realloc 函数之间的区别 详情:http://blog.csdn.net/fjb2080

    realloc函数使用总结

    realloc原型是extern void *realloc(void *mem...  #include &lt;stdlib&gt; 有些编译器需要#include ,在TC2.0中可以使用alloc.h头文件  功能  先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地

    mm.zip_Free!_realloc

    实现内存管理函数,包括malloc、free、realloc等函数的实现

    C语言函数realloc.doc-综合文档

    C语言函数realloc.doc

    malloc:我使用系统mmap实现的libc malloc,realloc和free函数; 尺寸分割和优化的空间使用

    我使用系统mmap实现的libc malloc,realloc和free函数 特征 大小分段:将请求分为SMALL,MEDIUM和LARGE,对SMALL和MEDIUM请求使用预分配的区域 释放碎片空间以优化重用 Hexdump分配的内存功能 实现的功能: malloc-...

    嵌入式系统/ARM技术中的浅谈malloc与 kmalloc、cmalloc、realloc、new 的区别

     Malloc 返回一块内存地址的指针,否则会返回空指针null,这里要注意的是,当内存不再使用的时候,用free()函数进行对内存的释放。  2.calloc  作 用:calloc()函数有两个参数,分别为元素的数目和每个元素...

    realloc问题.vsdx

    就是配套我一篇博客讲解的资源,因为我截图可能不是特别清楚,所以我就将这个图上传上来了。是采用Visio画的。

    realloc_test

    realloc_test

    malloc,realloc,calloc的总结.xlsx

    个人总结各类博客和资料里关于malloc,calloc,realloc的对比

    debug_new:C / C ++一切内存调试器-开源

    这只是其功能之一)在一种方式,但是使用内存状态来实现。 -跨平台+跨编译器支持(仅针对c ++使用预处理器和模板-voodoo-magic)-支持C和C ++-支持gcc和g ++-支持pthread和任何posix平台-支持多线程。 -易于使用和...

    c语言中malloc、realloc与calloc 的区别以及联系

    以下是对c语言中的malloc函数,realloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下

    1.操作系统实验3_2_内存管理之rt_realloc和rt_free1

    涉及到的硬件主要为串口 3,作为 rt_kprintf 输出,需要连接 JTAG 扩展板具体请参见《Realtouch 开发板使用手册》 实验原理及程序结构

    C++动态内存分配(new/new[]和delete/delete[])详解

    C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数malloc( )和free( ),以及malloc( )的变种(realloc:改变...

    Mod_Realloc.rar_MOD

    采用FOR90语言编制的实现类似Delphi中Setlength的动态数组扩展功能。原有的FORTRAN90的动态数组在扩展时首先需要释放掉原有空间,即原有数据不能得以保存,而SetLength(A,N)则将A的长度动态设定为N,而保持原有数据...

    内存分配管理的代码用C实现

    自己写的内存分配管理的代码,用C实现 主要是解决自己分配的内存忘记释放的问题,自己定义了几个函数取代了malloc,calloc,realloc,free这几个函数,尽量跟原有用法一致。 头文件mypool.h

    C语言动态内存分配之malloc与realloc区别

     使用动态内存很明显的好处是:不需要预先分配存储空间且分配的空间可以根据程序的需要扩大或缩小,这样可以有效的使用内存空间。  malloc和free  C函数库中的malloc和free分别用于执行动态内存分配和释放。这...

    指针是C语言可以用来直接访问内存地址

    在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们可以通过这个指针来访问和操作这块内存空间。同时,我们还可以使用free函数来释放...

    操作系统(内存管理)

    free:该函数获得指向由 malloc 分配的内存片段的指针,并将其释放,以便以后的程序或操作系统使用(实际上,一些 malloc 实现只能将内存归还给程序,而无法将内存归还给操作系统)。 物理内存和虚拟内存 要理解...

Global site tag (gtag.js) - Google Analytics