• 使用new实现realloc操作


        本文定义了一个宏来实现使用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个字节,看是否越界。  

  • 相关阅读:
    SSH框架——Sprign声明式事务
    SSH框架的简化
    Spring声明式事务管理
    简化注解shh框架
    ssh 的搭建
    基础篇-spring包的下载
    基础篇-struts2的搭建
    spring声明式事务管理
    shh简化
    shh(struts+spring+Hibernate)的搭建
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167979.html
Copyright © 2020-2023  润新知