我有一个与 Linux 平台上的 C++ 内存相关的问题。 这是我的源代码:
#include <deque>
#include <iostream>
#include <vector>
#include <unistd.h> // for linux
#include <fstream>
using namespace std;
class dog
{
public:
dog(size_t size): _size(size),
_values_1_f(size),
_values_2_f(size),
_values_1_uc(_size),
_values_2_uc(_size)
{
}
virtual ~dog();
std::vector<unsigned char> values_1_f() const;
private:
const size_t _size;
std::vector<unsigned char> _values_1_f;
std::vector<char> _values_2_f;
std::vector<unsigned char> _values_1_uc;
std::vector<unsigned char> _values_2_uc;
};
int32_t printMem()
{
// Open the /proc/self/statm file
std::ifstream statm_file("/proc/self/statm");
if (!statm_file) {
std::cerr << "Error opening /proc/self/statm" << std::endl;
return 1;
}
// Read the contents of the file
long pages, resident, shared, text, lib, data, dt;
statm_file >> pages >> resident >> shared >> text >> lib >> data >> dt;
statm_file.close();
// Get the page size
long page_size_kb = sysconf(_SC_PAGESIZE) / 1024;
// Calculate memory usage in KB
long total_memory = pages * page_size_kb;
long resident_memory = resident * page_size_kb;
long shared_memory = shared * page_size_kb;
long text_memory = text * page_size_kb;
long data_memory = data * page_size_kb;
// Print the memory usage
std::cout << "Total memory: " << total_memory << " KB" << std::endl;
std::cout << "Resident memory: " << resident_memory << " KB" << std::endl;
std::cout << "Shared memory: " << shared_memory << " KB" << std::endl;
std::cout << "Text memory: " << text_memory << " KB" << std::endl;
std::cout << "Data memory: " << data_memory << " KB" << std::endl;
}
int main()
{
std::deque<dog *> _dogs;
while(1)
{
for(int i = 0; i < 800000; i++)
{
_dogs.push_back(new dog(800));
}
std::cout << "After memory allocation"<< std::endl<< std::endl;;
printMem();
std::cout << std::endl<< std::endl;;
for (auto i = _dogs.begin(); i != _dogs.end() ; ) {
delete *i;
i = _dogs.erase(i); // erase returns the next iterator
}
_dogs.clear();
sleep(10);
std::cout << "After memory clean"<< std::endl;
printMem();
std::cout << std::endl<< std::endl;;
}
return 0;
}
dog::~dog()
{
}
std::vector<unsigned char> dog::values_1_f() const
{
return _values_1_f;
}
我尝试在 while 循环中分配一组狗并将它们推入 _dogs 出队中。 分配后,我尝试释放之前分配的内存。 这是我的问题。 对 printMem 的调用都打印相同的消息(所以看起来没有内存被清理,即使看看 htop),但 while 循环的多次迭代不会使内存增长。
所以我的问题是:你知道为什么会发生这种情况吗?如果删除失败,则在执行迭代时内存应该会增长。如果删除成功,删除后的内存应该比新建操作后要低很多。 任何提示将不胜感激。 如果您有一些解释我的错误的链接,请分享它们,我在编程中迷失了......
测量内存使用情况的方式只能测量操作系统占用进程的内存量。从操作系统分配和释放内存的成本很高(例如,请参阅系统调用开销),并且只能在完整内存页(4 kiB)中工作。因此,内存分配器会缓存小分配以供重用。
malloc_stats()
研究 glibc 分配器的状态。分配器的内部结构在其 wiki 中有解释。特别是本节:
“释放”内存实际上并不会将其返回给操作系统以供其他应用程序使用。 free() 调用将一块内存标记为“可供应用程序重用”,但从操作系统的角度来看,该内存仍然“属于”应用程序。