前言

在linux程序中,会new一个会话类,如果不符合条件,会删掉。
在new和delete时,为了调试,打印这个类指针地址,用来辅助判断有多少个会话进来和销毁。
tail -f /var/log/messages时,看到大部分都是都是一个地址,心里一惊。
但是逻辑没错,难道一个指针用完,再new一个指针,用的还是空闲的那块地址?
这个知识点没注意过,今天验证了一下。

验证完的结论,内存管理程序会优先用空闲的那块内存,所以打印出的地址大部分是相同的。
linux和windows都是这样的。

所以,要跟踪一个new出的类指针,打印地址不靠谱,要打印类方法提供的信息才行。e.g. 给每个类加一个info方法,将需要的类信息打印出来。这样,创建和销毁的时候,就知道具体的类信息了。

实验

// @file main.cpp#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <syslog.h>
#include <unistd.h>
#include <sys/types.h>#include "my_syslog.h"#ifndef SAFE_DELETE
#define SAFE_DELETE(p) \if (NULL != (p)) { \delete (p); \(p) = NULL; \}
#endif // #ifndef SAFE_DELETEvoid init();
void uninit();int fn_test();int main()
{init();fn_test();uninit();return EXIT_SUCCESS;
}void init()
{ns_syslog::open_syslog("test_new");// 设置控制变量中的日志条件, 实际应用中, 是从配置文件读取的控制开关ns_syslog::g_log_condition.b_EMERG = false;ns_syslog::g_log_condition.b_CRIT = true;ns_syslog::g_log_condition.b_ALERT = true;ns_syslog::g_log_condition.b_ERR = true;ns_syslog::g_log_condition.b_WARNING = true;ns_syslog::g_log_condition.b_NOTICE = true;ns_syslog::g_log_condition.b_INFO = true;ns_syslog::g_log_condition.b_DEBUG = true;// 根据控制变量, 设置日志的mask// 在实际应用中, 这里可以是动态设置, e.g. 配置文件检测线程发现配置变了, 需要变更某些级别的日志记录结果ns_syslog::set_log_level(ns_syslog::g_log_condition.b_EMERG, ns_syslog::g_log_condition.b_ALERT,ns_syslog::g_log_condition.b_CRIT,ns_syslog::g_log_condition.b_ERR,ns_syslog::g_log_condition.b_WARNING,ns_syslog::g_log_condition.b_NOTICE,ns_syslog::g_log_condition.b_INFO,ns_syslog::g_log_condition.b_DEBUG);
}void uninit()
{ns_syslog::close_syslog();
}int fn_test()
{int i_log_index = 0;char* psz_buf = NULL;char* psz_buf1 = NULL;MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);MYLOG_D("........................................");psz_buf = new char[1024];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);psz_buf = new char[1024];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);psz_buf = new char[1024];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);psz_buf = new char[1024 + 1];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);psz_buf = new char[1024 + 1];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);psz_buf = new char[1024 + 1];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}SAFE_DELETE(psz_buf);MYLOG_D("........................................");psz_buf1 = new char[1024]; if (NULL != psz_buf1) {MYLOG_D("%d. psz_buf1 addr = %p\n", ++i_log_index, psz_buf1);}SAFE_DELETE(psz_buf1);psz_buf1 = new char[1024 + 1]; if (NULL != psz_buf1) {MYLOG_D("%d. psz_buf1 addr = %p\n", ++i_log_index, psz_buf1);}SAFE_DELETE(psz_buf1);// 以上psz_buf的地址都是一个值MYLOG_D("........................................");psz_buf = new char[1024 + 1];if (NULL != psz_buf) {MYLOG_D("%d. psz_buf addr = %p\n", ++i_log_index, psz_buf);}psz_buf1 = new char[1024]; if (NULL != psz_buf1) {MYLOG_D("%d. psz_buf1 addr = %p\n", ++i_log_index, psz_buf1);}SAFE_DELETE(psz_buf);SAFE_DELETE(psz_buf1);// 同时使用一个以上的buf时,地址才不同. // so, on linux, 查看地址上带的内容是否为新内容,不能依赖打印buffer的地址,而要看地址中带的内容// 看到不断的new和delete同一个地址,也不要惊:)// 在windows上,用同样的代码做过实验了,和linux实验结果相同return EXIT_SUCCESS;
}/** run result
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.73 : fn_test()] : 1. psz_buf addr = (nil)
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.75 : fn_test()] : ........................................
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.78 : fn_test()] : 2. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.84 : fn_test()] : 3. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.90 : fn_test()] : 4. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.96 : fn_test()] : 5. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.102 : fn_test()] : 6. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.108 : fn_test()] : 7. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.112 : fn_test()] : ........................................
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.115 : fn_test()] : 8. psz_buf1 addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.121 : fn_test()] : 9. psz_buf1 addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.127 : fn_test()] : ........................................
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.130 : fn_test()] : 10. psz_buf addr = 0x1daa010
Feb  3 21:41:09 localhost test_new[26679]: [DEBUG : main.cpp.135 : fn_test()] : 11. psz_buf1 addr = 0x1daa420
*/

new指针后,地址相同相关推荐

  1. C++指针与地址详解 _0

    指针的概念 ◆ 1."存储器"的概念 文件柜–>文件柜上的抽屉–>抽屉上的编号 对应于: 存储器-–>存储单元-–>存储单元的地址 ◆ 2.存储器的使用 1 ...

  2. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)

    文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...

  3. 学习指针后对int main(int argc, char *argv[]),“()“内部参数的详解(初学者不要怕,浅浅学过指针的就可以看懂)

    大二时,出学51单片机时,经常写程序然后烧录程序,免不了去借鉴一些大佬的代码,但有些代码的主函数在当时的我看起来很奇怪,因为那时学的少,所以时常不敢于借鉴.例如int main(int argc,ch ...

  4. %p 打印地址?它打印的是变量值!什么是格式化输出,指针与地址的区别

    不要再被什么"%p 打印变量地址"."%p 格式化地址" 误导了! 不要把指针神秘化.复杂化,它就是一个有点特殊的变量而已! 首先说指针与地址的区别: 指针是一 ...

  5. C和C++中指针与地址的区别

    在C语言和C++中,指针是非常重要的一部分,程序的执行过程中可以通过指针来找到要操作的数据和可执行的函数代码.很多人就明白指针和地址是有区别的,但是很少有人能说清楚这种区别. 指针总共可以分为两种,函 ...

  6. 5.1 指针与地址 (C)

    指针与地址 --<C程序设计语言(第2版-新版)>5.1 一元运算符&可用于取一个对象的地址,因此,下列语句: p = &c; 将把 c 的地址赋值给变了p,我们称 p 为 ...

  7. C语言中指针的地址和内容

    参考:C语言中指针的地址和内容 作者:wallying 发布时间:2018-10-18 09:47:54 网址:https://blog.csdn.net/qq_36631580/article/de ...

  8. 字符串指针的地址的传递

    字符串指针的地址的传递 #include <iostream>using namespace std;void change(char **a) {(*a)++; }int main() ...

  9. 成都拓嘉启远:拼多多下单后地址错误能改吗

    在拼多多上面有一个默认地址,如果用户在购物下单的时候不更改,那么就会把收货地址记成默认地址,那么拼多多下单后发现地址是错误的那么还可以更改吗?在哪里更改呢? 如果拼多多下单后的地址是错误的,那么是可以 ...

  10. 指针和地址之间的关系是什么?

    学习交流可加 微信读者交流①群 (添加微信:coderAllen) 程序员技术QQ交流①群:736386324 **常见的一个疑问是: 归根结底, 指针就是地址, 地址就是内存中被分配的"门 ...

最新文章

  1. 开源如何占领软件世界?
  2. 实时记录运动轨迹插件_智慧工地:“全能安全帽”自带WiFi 可实时拍摄通话
  3. 云服务器与传统服务器的优势差异
  4. des和aes相比较有哪些特点_栓流气力输送相比较传统的高速气力输送方式而言,有哪些优势?...
  5. Q-learning家族【强化学习】
  6. c#中怎么禁用和开启无线网卡?
  7. β射线与哪些物质可产生较高的韧致辐射_什么是α射线、β射线、γ射线
  8. 领域驱动设计 软件核心复杂性应对之道_DDD - 领域驱动设计对软件复杂度的应对(上)...
  9. 解决滑动UITableView自动显示delete按钮
  10. 非支架生成的情况下,验证错误信息输出方法,%= f.error_messages %错误
  11. Qt QDataVisualization 三维图 坐标轴 显示比例
  12. 2021年高处安装、维护、拆除考试报名及高处安装、维护、拆除复审模拟考试
  13. c语言程序分数化简,【C/C++】分数化简
  14. 如何将qlv格式视频转换成MP4?这款功能极强的视频格式转换工具不要错过
  15. WEKA-Instances-从内存中创建数据集
  16. 刷刷刷!-数据分析必刷文档整理
  17. 修复iPhone8白屏的3种方法,可保留设备数据
  18. python全栈开发要学些什么_战争热诚的python全栈开发之路
  19. 如何独立设置Mac触摸板方向和鼠标滚轮方向?
  20. Tomcat部署war包项目

热门文章

  1. 恶搞版西游记,99%的人看完后当场含笑而死
  2. G6309列车02车05D号
  3. css3 烟 蚊香_如何使用纯CSS实现蚊香燃烧的效果(附源码)
  4. C++异常机制的实现方式和开销分析(作者:白杨)
  5. 远程桌面连接的工具及使用方法
  6. 线性代数考研笔记(四)
  7. 为何工作让你没有成就感
  8. Ubuntu aria2c 下载
  9. 看不懂电路图?学会这10大原则7大步骤,电路图so easy!
  10. android自定义美颜相机,效果最自然 美颜相机for Android版更新