Trong chương trình C đơn giản của tôi (gnu linux) Tôi nhận được giá trị rss từ proc/stat.
int GetRSS()
trả về giá trị RSS từ proc/stat cho quy trình của tôi.sự điên rồ là miễn phí()
Trong trường hợp này:
printf("A RSS=%i\n", GetRSS());
char *cStr = null;
cStr = malloc(999999);
if (cStr != NULL)
{
printf("B RSS=%i\n", GetRSS());
free(cStr);
printf("C RSS=%i\n", GetRSS());
}
tôi nhận được:
A RSS=980
B RSS=984
C RSS=980
Tôi không thể giải thích tại sao C
không trở về 984
.
Nếu tôi chạy thủ tục tương tự hai lần tôi nhận được:
A RSS=980
B RSS=984
C RSS=980
B RSS=984
C RSS=980
Trông tốt.
Nhưng, trong trường hợp này:
struct _test
{
char *pChar;
}
struct _test **test_ptr;
int i = 0;
printf("D RSS=%i\n",GetRSS());
assert(test_ptr = (struct _test **)malloc((10000) * sizeof(struct _test *)));
for (i = 0; i < 1000; i++)
{
assert(test_ptr[i] = (struct _test *)malloc(sizeof(struct _test)));
test_ptr[i]->pChar=strdup("Some garbage");
}
printf("E RSS=%i\n", GetRSS());
for (i=0; i<1000; i++)
{
free(test_ptr[i]->pChar);
free(test_ptr[i]);
}
free(test_ptr);
printf("F RSS=%i\n", GetRSS());
tôi nhận được:
D RSS=980
E RSS=1024
F RSS=1024
D RSS=1024
E RSS=1024
F RSS=1024
Huh? Tại sao bộ nhớ không giải phóng ở đây?
Bạn không bao giờ nên đặt các biểu thức có hiệu ứng phụ vào 'khẳng định'. –
Đủ rồi. Phớt lờ nó đi. Tuy nhiên, kết quả là bối rối. –
Chạy chương trình của bạn dưới "strace" để bạn có thể theo dõi các cuộc gọi mmap/munmap thực sự có ảnh hưởng đến giá trị RSS.Bạn có thể đặt một số printfs xung quanh mã để bạn có thể so khớp mmap/munmap với các điểm cụ thể của mã của bạn trong đầu ra. – vanza