使用new实现realloc操作

摘要:
本文定义了一个宏来实现用new、#include<_ msize(p));pold[i]<&书信电报;}删除[]pold;Malloc和free是C++/C语言的标准库函数。对象将在死亡前自动执行析构函数。因此,C++语言需要一个能够完成动态内存分配和初始化的运算符new。

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

  1. #include <iostream>
  2. #include <malloc.h>
  3. using namespace std;
  4. // p - 内存指针
  5. // n - 申请内存数量
  6. // T - 申请内存类型
  7. #define RENEW(p, n, T)/
  8. {/
  9.     T* pNew = new T[n];/
  10.     memcpy(pNew, p, _msize(p));/
  11.     delete[] p;/
  12.     p = pNew;/
  13. }
  14. void main(void)
  15. {
  16.     char* pold = new char[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 = new int[5];
  24.     for (int i = 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.     
  38.     delete[] pold;*/
  39. }

几个问题:

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个字节,看是否越界。  

免责声明:文章转载自《使用new实现realloc操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux的用户和组C# .NET 0配置使用Wcf(半成品)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iphone(ios)不同设备的内存和游戏不闪退峰值

ios内存限制 不同内存的苹果机型上(1G,2G,3G,4G…),游戏内存的峰值一般最高多少能保证不闪退? 一般来讲最保险的就是不超过机器总内存的50%,具体每个机型的内存限制在列出在下面。 原贴:《ios app maximum memory budget》 注意事项:查看当前app占用多少内存,通过OS的API来获取,而不要通过引擎自己的API来获取。...

JAVA内存关注总结,作为个程序员需要对自己系统的每块内存做到了如指掌

 服务器的JAVA进程使用的内存是否正常  服务器中,JAVA进程的内存占用= JVM内存+ JAVA堆最大内存大小(Xmx)+JAVA堆外内存大小+栈区( 线程数* Xss) 最需要关注: 1., 服务器内存是否够JAVA进程开销 坑点: 每次JAVA的启动,只是检查当前linux的RES内存, 并不会检查申请的内存大小。 如, 服务器内存16G ,J...

15分钟让你了解如何实现并发中的Barrier

说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了。而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿。但是c++标准库里还没有这个概念,只有boost里面有这样现成的东西,而我又不想为了这么一个小东西引入个boost。所以,我借着这个机会研究了下,发现其实这些多线程/并发中的东西还是蛮有意思的。 阅读本文你可...

最全Pycharm教程(10)——Pycharm调试器总篇

  最全Pycharm教程(1)——定制外观   最全Pycharm教程(2)——代码风格   最全Pycharm教程(3)——代码的调试、执行   最全Pycharm教程(4)——有关Python解释器的相关配置   最全Pycharm教程(5)——Python快捷键相关设置   最全Pycharm教程(6)——将Pycharm作为Vim编...

centos 配置rsync+inotify数据实时同步2

一、Rsync服务简介 1. 什么是Rsync 它是一个远程数据同步工具,它在同步文件的同时,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。可以保持原来文件的权限、时间、软硬链接等附加信息。 2. Rsyn...

Java后台开发规范

Java后台开发规范 1.Java编程规范 1.1.命名风格 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO 接口类中的方法和属性不要加任何修饰符号,保持代码的简洁性,并加上有效的 Javadoc 注释...