• 关于new和delete


    感谢代码疯子的的这篇博客http://www.programlife.net/debugger-magic-number.html

    先帖代码

     1 #include "stdafx.h"
     2 #include "iostream"
     3 #include "stdio.h"
     4 #include "string.h"
     5 #include "stdlib.h"
     6 using namespace std;
     7 const int nMaxSize=26;
     8 typedef struct Node
     9 {
    10     Node * Next[nMaxSize];
    11     Node()
    12     {
    13         for (int i=0;i<nMaxSize;i++)
    14         {
    15             Next[i]=NULL;
    16         }
    17     }
    18 }Node,* pNode;
    19 Node root;
    20 typedef void * pdata;
    21 void Insert(char * pStr)
    22 {
    23     Node * p=&root;
    24     for (int i=0;i<strlen(pStr);i++)
    25     {
    26         int id=pStr[i]-'a';
    27         if (p->Next[id]!=NULL)
    28         {
    29             printf("test log
    ");
    30         }
    31         else
    32         {
    33             p->Next[id]=new Node();
    34         }
    35     }
    36 
    37 }
    38 void Delete(pNode p)
    39 {
    40     if (p==NULL) return;
    41     for (int i=0;i<nMaxSize;i++)
    42     {
    43         Delete(p->Next[i]);
    44         p->Next[i]=NULL;//添加这一句,解决二次delete
    45     }
    46     if (p==&root)
    47     return;
    48     delete p;
    49     p=NULL;
    50 }
    51 void te(int& a)
    52 {
    53 
    54     a=0;
    55 }
    56 void te2(void* & pd)
    57 //void te2(pdata& pd)
    58 {
    59 
    60     pd=NULL;
    61 }
    62 int _tmain(int argc, _TCHAR* argv[])
    63 {
    64     char szBuffer[16];
    65     unsigned int nTmp = 0;
    66     sprintf(szBuffer, "0x%X", -20);
    67     nTmp = strtoul(szBuffer, NULL, 16);
    68     printf("%u
    ", nTmp);
    69 
    70     int var0=0;
    71     printf("Insert a string
    ");
    72     Insert("a");
    73     Delete(&root);
    74     printf("Insert the same string again
    ");
    75     Insert("a");
    76     Delete(&root);
    77 
    78     int var1=4;
    79     te(var1);
    80     int * pvar1=&var1;
    81     pdata tp=(pdata)pvar1;
    82     //pdata tp;
    83     te2(tp);
    84     //te2((pdata)pvar1);//错误的写法,编译通不过
    85     //te(2);
    86     int *p1 = new int();
    87     int *p2 = p1;
    88     delete p1;
    89     p1 = NULL;
    90     scanf("%d",&var0);
    91     return 0;
    92 }

    搞明白了typedef和函数引用型参数的问题。

    测试发现,56、57行效果是一样的,第83行就能实现将tp置为NULL,84行直接编译通不过。

    还是学的不精通,到底编译器内部发生了什么不知道,看样子还得学习汇编啊

    上述代码除了改动了几行,完全转载自http://www.programlife.net

  • 相关阅读:
    【转】C++11优化使用emplace,emplace_back
    面试经历总结
    Hive常用函数
    股票指标
    Visual Studio Code 可以翻盘成功主要是因为什么?
    openpyxl模块操作Excel
    JavaScript(二)
    前端之CSS
    ps导出ICO格式
    Qt 所有版本官方下载地址
  • 原文地址:https://www.cnblogs.com/zhiying678/p/3200565.html
Copyright © 2020-2023  润新知