Saya pikir mallinfo() adalah yang Anda inginkan:
#include <malloc.h>
struct mallinfo *info;
info = mallinfo();
printf ("total allocated space: %llu bytes\n", info->uordblks);
printf ("total free space: %llu bytes\n", info->fordblks);
Struktur struct mallinfo bersifat teknis, dan khusus untuk implementasi malloc(). Tetapi informasi yang Anda inginkan ada di sana. Inilah cara saya melaporkan nilai:
mallinfo.arena = "Total Size (bytes)"
mallinfo.uordblks = "Busy size (bytes)"
mallinfo.fordblks = "Free size (bytes)"
mallinfo.ordblks = "Free blocks (count)"
mallinfo.keepcost = "Top block size (bytes)"
mallinfo.hblks = "Blocks mapped via mmap() (count)"
mallinfo.hblkhd = "Bytes mapped via mmap() (bytes)"
Keduanya diduga tidak digunakan, tetapi tampaknya berubah di sistem saya, dan karenanya mungkin valid:
mallinfo.smblks = "Fast bin blocks (count)"
mallinfo.fsmblks = "Fast bin bytes (bytes)"
Dan nilai menarik lainnya dikembalikan oleh "sbrk (0)"
Ada sejumlah kemungkinan.
Seberapa akurat Anda membutuhkannya? Anda bisa mendapatkan beberapa data berguna melalui cat /proc/${PID}/status | grep VmData .
Anda dapat #define malloc() Anda sendiri , realloc() , kalloc() , dan gratis() fungsi, membungkus fungsi sebenarnya di belakang meja Anda sendiri. Anda dapat melakukan hal-hal keren di sini dengan __FILE__, __LINE__, &__func__ untuk memudahkan mengidentifikasi kebocoran inti dalam pengujian sederhana. Tapi itu hanya akan melengkapi kode Anda sendiri!
(Demikian pula, Anda juga dapat mendefinisikan ulang operator baru default dan hapus operator metode, varian array dan non-array, dan keduanya melempar varian std::bad_alloc dan std::nothrow_t. Sekali lagi, ini hanya akan melengkapi kode Anda sendiri!)
(Perhatikan:Pada sebagian besar sistem C++, baru akhirnya memanggil malloc() . Tidak harus. Terutama dengan baru di tempat ! Namun biasanya baru menggunakan malloc() . (Atau beroperasi pada wilayah memori yang sebelumnya telah malloc()'ed .) Kalau tidak, Anda akan masuk ke hal-hal yang sangat funky dengan beberapa manajer heap...)
Anda dapat menggunakan sbrk(0) untuk melihat di mana segmen data saat ini disetel. Itu tidak terlalu bagus. Ini adalah pengukuran yang sangat kasar, dan tidak memperhitungkan lubang (wilayah memori yang tidak terpakai) di heap. (Anda jauh lebih baik dengan VmData baris dari /proc/${PID}/status .) Namun jika Anda hanya mencari gambaran umum...
Anda dapat menjebak malloc()/free()/etc dengan menulis perpustakaan bersama Anda sendiri dan memaksa proses Anda untuk menggunakannya alih-alih versi sebenarnya melalui LD_PRELOAD . Anda dapat menggunakan dlopen()/dlsym() untuk memuat &memanggil *real* malloc()/free()/etc . Ini bekerja dengan sangat indah. Kode asli tidak dimodifikasi, bahkan tidak dikompilasi ulang. Namun waspadai situasi peserta ulang saat mengkode perpustakaan ini, dan bahwa proses Anda awalnya akan memanggil malloc()/calloc()/realloc() sebelum dlopen()/dlsym() dapat menyelesaikan pemuatan fungsi sebenarnya.
Anda dapat melihat alat seperti Valgrind , meskipun itu sebenarnya lebih ditujukan pada kebocoran memori.
Lagi pula, mungkin mtrace() adalah apa yang Anda inginkan? Atau __malloc_hook ? Sangat berpemilik (GNU) &tidak standar... Tapi Anda diberi tag "Linux"...
Tidak ada yang mudah, otomatis cara untuk melakukannya, jika itu yang Anda minta. Anda pada dasarnya harus melacak sendiri alokasi tumpukan secara manual menggunakan variabel penghitung. Masalahnya adalah sulit untuk mengontrol bagian mana dari program Anda yang mengalokasikan memori di heap, terutama jika Anda menggunakan banyak pustaka di luar kendali Anda. Untuk lebih memperumit masalah, ada dua cara program mengalokasikan memori heap:new
atau malloc
. (Belum lagi panggilan OS langsung seperti sbrk
.)
Anda dapat mengganti operator global new
, dan minta setiap panggilan untuk meningkatkan penghitungan global. Namun, ini belum tentu termasuk saat program Anda memanggil malloc
, atau saat program Anda menggunakan beberapa new
khusus kelas mengesampingkan. Anda juga dapat mengganti malloc
menggunakan makro, tetapi ini belum tentu portabel. Dan Anda juga harus mengganti semua variasi malloc
, seperti realloc
, calloc
, dll. Semua ini semakin diperumit oleh fakta bahwa pada beberapa implementasi, new
sendiri dapat memanggil malloc
.
Jadi, pada dasarnya, sangat sulit untuk melakukannya dengan benar dari dalam program Anda. Sebaiknya gunakan alat pemrofil memori saja.