C语言中的内存分配测试-如何为malloc和free编写CUnit测试?
几天以来,我一直在为我的一个无法修复的应用程序进行测试。所以我决定为我的测试写一个测试 我想分配内存,观察内存的增长,然后再次释放内存。我认为分配的内存不再使用了,对吗 我正在开发MacOSX(10.6.8)和gcc(gcc)4.2.1 所以我写了这个测试:C语言中的内存分配测试-如何为malloc和free编写CUnit测试?,c,testing,malloc,free,cunit,C,Testing,Malloc,Free,Cunit,几天以来,我一直在为我的一个无法修复的应用程序进行测试。所以我决定为我的测试写一个测试 我想分配内存,观察内存的增长,然后再次释放内存。我认为分配的内存不再使用了,对吗 我正在开发MacOSX(10.6.8)和gcc(gcc)4.2.1 所以我写了这个测试: void testMemoryFreeCheck(){ puts("- test Memory Free Check -"); puts("- ----------------------- -"); puts("
void testMemoryFreeCheck(){
puts("- test Memory Free Check -");
puts("- ----------------------- -");
puts("- This test takes a while -");
puts("");
struct rusage rus;
getrusage(RUSAGE_SELF, &rus);
// Things befor we want to mature.
char *holder[10000];
char *bigHolder;
int loops = 10000;
int i;
// Variables used for tests.
long int afterFirstTestKiloByte = 0;
long int afterSecondTestKiloByte = 0;
long int afterThirdTestKiloByte = 0;
long int afterForuthTestKiloByte = 0;
getrusage(RUSAGE_SELF, &rus);
long int initialKiloByte = rus.ru_maxrss;
printf("Initial KB Used: %ld\n", initialKiloByte);
// a adder to proof that we get it write
char add = "A";
getrusage(RUSAGE_SELF, &rus);
long int afterAddKiloByte = rus.ru_maxrss;
printf("After a char add KB Used: %ld\n", initialKiloByte);
getrusage(RUSAGE_SELF, &rus);
long int growingKiloByte = rus.ru_maxrss;
// This loop should do nothing.
for(i=0; i<loops; ++i){
printf(".");
}
puts("");
getrusage(RUSAGE_SELF, &rus);
afterFirstTestKiloByte = rus.ru_maxrss;
printf("First Test should be 0 : %ld\n", (afterFirstTestKiloByte - afterAddKiloByte));
CU_ASSERT_TRUE( (afterFirstTestKiloByte - afterAddKiloByte) == 0);
// This loop should free all allocated space.
for(i=0; i<(loops * 128); ++i){
char *tmp = malloc(1024 * 1024);
free(tmp);
}
getrusage(RUSAGE_SELF, &rus);
afterSecondTestKiloByte = rus.ru_maxrss;
printf("Second Test should be 0 (4096 is ok for some reasons): %ld\n", (afterSecondTestKiloByte - afterAddKiloByte));
CU_ASSERT_TRUE( (afterSecondTestKiloByte - afterAddKiloByte) <= 4096);
// This loop should increase the allocated space.
for(i=0; i<loops; ++i){
holder[i] = malloc(1024 * 1024);
}
getrusage(RUSAGE_SELF, &rus);
afterThirdTestKiloByte = rus.ru_maxrss;
printf("Third Test should be grater than 0 : %ld\n", (afterThirdTestKiloByte - afterAddKiloByte));
CU_ASSERT_TRUE( (afterThirdTestKiloByte - afterAddKiloByte) > 0);
// now free the memmory and get back to the initial value
for(i=0; i<loops; ++i){
free(holder[i]);
}
getrusage(RUSAGE_SELF, &rus);
afterForuthTestKiloByte = rus.ru_maxrss;
printf("Forth Test should be reset to 0 : %ld\n", (afterForuthTestKiloByte - afterAddKiloByte));
CU_ASSERT_TRUE( (afterThirdTestKiloByte - afterAddKiloByte) == 0);
puts("- ----------------------- -");
}
我现在有两个问题无法解释:
1.为什么第二次测试是4096而不是0?
2.为什么第四次考试是零分
第四次考试把我吓坏了。请看一看,也许你可以解释如何测试一个空闲内存调用。我假设内存管理器不会杀死字节,而是重用它,因此内存会感染rus.ru_maxrss。
但是我怎样才能免费测试呢
Thanx很多,
Peter使用
malloc
分配的内存不会返回到操作系统,即使空闲时也是如此。在程序退出之前,内存不会返回到操作系统
getrusage
返回操作系统测量的程序使用的内存量
结合以上信息,您就可以回答这两个问题。非常感谢nightcracker,这很有意义。但是你知道一个技巧如何测试一个函数是否释放了所有分配的空间吗?我在一个项目的功能中遇到了一些麻烦,我必须编写一个测试来弄清楚和证明。@彼得肖:如果我的答案解决了你的问题,请考虑把它作为一个可接受的答案,通过将复选框勾到我的答案的左边。@彼得肖:一般来说,你使用一个工具,比如“代码> Valgnnd<代码>这样的测试。但是,如果您真的想将内存返回到操作系统,您必须使用操作系统的API来分配/释放内存。好吧,没有办法让C运行时为你做这件事。这是我所有这两个问题的答案,但是你知道我如何测试占用越来越多内存的函数吗?我必须确定我把它修好了。蒂亚。
- test Memory Free Check -
- ----------------------- -
- This test takes a while -
Initial KB Used: 458752
After a char add KB Used: 458752
[...]
First Test should be 0 : 0
Second Test should be 0 (4096 is ok for some reasons): 4096
Third Test should be grater than 0 : 1601536
Forth Test should be reset to 0 : 1601536
- ----------------------- -