1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | #include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <time.h> #include <stdlib.h> #include <pthread.h> /* int new_size = 1 * 1024 * 1024; int g_write_flg = 0; void run_cpu() { int a = 1; for (int i = 1; i < 1000 * 1000 * 1000; ++i) { a = a/i; } } void writefile(FILE* f,char *fname,char * ctx,int nsize) { f = fopen(fname, "w");// if (f) { fwrite(ctx, 1, nsize, f); fclose(f); } else { printf("writefile fopen failed!\n"); } } void* test_fun(void* fd) { printf("test_fun begin.... idx:%d\n", *(int*)fd); int idx = *(int*)fd; char cfile[10]; sprintf(cfile, "./out%d.txt", idx); FILE* f = NULL;// fopen(cfile, "w"); while (true) { char* p = new char[new_size]; memset(p, idx, new_size); if (g_write_flg) { printf("write file :%s size:%d MB\n",cfile, new_size/(1024*1024)); writefile(f,cfile, p, new_size); } run_cpu(); delete[] p; sleep(2); } } void create_test_thread(int idx, pthread_t &thread) { int *tmpidx = new int; *tmpidx = idx; if (pthread_create(&thread, NULL, test_fun, tmpidx) != 0)//´´½¨×ÓÏß³Ì { perror("pthread_create check_inite_rknn_stuck"); } else { pthread_detach(thread); } } int main(int argc, char *argv[]) {//²ÎÊý1£ºÊÇ·ñдÎļþ ²ÎÊý2£º²âÊÔÏ̸߳öÊý ²ÎÊý3£ºÃ¿´ÎÉêÇëÄÚ´æ´óС£¨M£© if (argc != 4) { printf("input arg param is error! \n"); return 0; } g_write_flg = atoi(argv[1]); int threadnum = atoi(argv[2]); int nsize = atoi(argv[3]); new_size = nsize * new_size; printf("write_flg:%d thread num:%d new_size:%d\n",g_write_flg,threadnum, nsize); pthread_t thread[1024]; for (int i = 0; i < threadnum; ++i) { create_test_thread(i,thread[i]); sleep(1); } while (true) { printf("test running ...\n"); sleep(20); } return 0; } */ int new_size = 0; void * test_fun( void * fd) { printf ( "test_fun begin.... idx:%d\n" , *( int *)fd); int idx = *( int *)fd; int cnt = 0; while ( true ) { char * p = new char [new_size]; memset (p, '0' +idx, new_size); ++cnt; //delete[] p; if (cnt % 100 == 0) { printf ( "thread %d new size:%d k adress:%X\n" , idx, new_size * cnt / 1024,p); sleep(3); } } } void create_test_thread( int idx, pthread_t& thread ) { int * tmpidx = new int ; *tmpidx = idx; if (pthread_create(& thread , NULL, test_fun, tmpidx) != 0) //´´½¨×ÓÏß³Ì { perror ( "pthread_create check_inite_rknn_stuck" ); } else { pthread_detach( thread ); } } int main() { int n; int sz; while ( true ) { printf ( "input case \n" ); scanf ( "%d" , &n); switch (n) { case 0: { printf ( "new char size:\n" ); scanf ( "%d" , &n); char * p = new char [n]; printf ( "input use memory size\n" ); scanf ( "%d" , &n); if (n) { memset (p, 0, n); } printf ( "input any continue delete..\n" ); scanf ( "%d" , &n); delete [] p; } break ; case 1: { printf ( "test char tmp[8 * 1024] \n" ); char tmp[8 * 1024]; printf ( "input use memory size\n" ); scanf ( "%d" , &n); if (n) { memset (tmp, 0, n); } printf ( "input any continue \n" ); scanf ( "%d" , &n); } break ; case 2: { printf ( "test 3 times new and not delete\n" ); printf ( "input new memory size k\n" ); scanf ( "%d" , &n); sz = n; printf ( "input use memory size\n" ); scanf ( "%d" , &n); for ( int i = 0; i < 3; ++i) { printf ( "cnt:%d\n" , i); char * p = new char [sz * 1024]; if (n) { memset (p, 0, n * 1024); } sleep(5); } } break ; case 3: { printf ( "test 3 times new and delete\n" ); printf ( "input new memory size k\n" ); scanf ( "%d" , &n); sz = n; printf ( "input use memory size\n" ); scanf ( "%d" , &n); for ( int i = 0; i < 3; ++i) { printf ( "new char cnt:%d\n" , i); char * p = new char [sz * 1024]; if (n) { memset (p, 0, n * 1024); } sleep(5); printf ( "delete p \n" ); delete [] p; sleep(5); } } break ; case 4: { char tmp[1024]; break ; } case 5: { char tmp[1024]; break ; } case 6: { printf ( "test 1024 times new and delete small mem\n" ); printf ( "input new small memory size k\n" ); scanf ( "%d" , &n); for ( int i = 0; i < 1024; ++i) { printf ( "new char cnt:%d\n" , i); char * p = new char [n * 1024]; if (n) { memset (p, 0, n * 1024); } if (i % 100 == 0) { sleep(3); } } break ; } case 7: { int threadnum = 0; printf ( "input thread num\n" ); scanf ( "%d" , &threadnum); int nsize = 0; printf ( "input new_size k\n" ); scanf ( "%d" , &nsize); new_size = nsize * 1024; pthread_t thread [1024]; for ( int i = 0; i < threadnum; ++i) { create_test_thread(i, thread [i]); sleep(1); } break ; } default : break ; } } return 0; } //while true; do pmap -x $(pidof test_mem.bin) > test1; sleep 2; pmap -x $(pidof test_mem.bin) > test2;echo xxxxxxxxxxx;diff test1 test2;sleep 1; done /* while true; do pmap -x $(pidof sh.bin) > test1; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test2 test1; sleep 1; pmap -x $(pidof sh.bin) > test2; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test1 test2; sleep 1; done */ /* while true; do pmap -x 42971 > test1; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test2 test1; sleep 1; pmap -x 42971 > test2; echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx; diff test1 test2; sleep 1; done */ |
测试一: 使用栈区内存
pmap -x 16445 > 1
输入1,进入case 1
pmap -x 16445 > 1-used
diff 1 1-used
< 0000007fb3cff000 1220 836 0 r-x-- libc-2.24.so
> 0000007fb3cff000 1220 900 0 r-x-- libc-2.24.so
反复测试进入case 1,结果始终不变
测试二: 进入case 0 使用堆
1.输入1024 大小内存
内存结构和测试一结果完全一致,内存没有发生变化
包括new 后 memset 后 以及delete后都没发生变化
2.输入8192 大小内存
刚new出来8192内存后
diff 0-new-1024 0-new-8192
< 00000055a4c6b000 200 12 12 rw--- [ anon ]
> 00000055a4c6b000 200 16 16 rw--- [ anon ]
使用memset设置8192内存
diff 0-new-8192 0-used-8192
< 00000055a4c6b000 200 16 16 rw--- [ anon ]
> 00000055a4c6b000 200 20 20 rw--- [ anon ]
delete 8192 内存
diff 0-used-8192 0-delete-8192
没有任何变化
反复测试8192内存,内存结构没有任何变化
3.输入1048576(1M)内存
diff 0-delete-8192 0-new-1048576
> 0000007fb3bfe000 1028 4 4 rw--- [ anon ]
> 0000007fb3bfe000 0 0 0 rw--- [ anon ]
在新的内存区域重新分配了1028k空间
memset设置内存后显示使用的物理内存增加了1024k
diff 0-new-1048576 0-used-1048576
< 0000007fb3bfe000 1028 4 4 rw--- [ anon ]
> 0000007fb3bfe000 1028 1028 1028 rw--- [ anon ]
使用delete释放内存后
diff 0-used-1048576 0-delete-1048576
< 0000007fb3bfe000 1028 1028 1028 rw--- [ anon ]
< 0000007fb3bfe000 0 0 0 rw--- [ anon ]
说明申请的1M空间是完全被释放掉了
4.测试小内存分配后不释放
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理