c++ - 堆上的内存是如何耗尽的?

标签 c++ memory-management out-of-memory

我一直在测试我自己的一些代码,看看需要多少分配的内存来耗尽堆或空闲存储上的内存。但是,除非我的代码在测试中出错,否则我在堆上可以放置多少内存方面会得到完全不同的结果。

我正在测试两个不同的程序。第一个程序在堆上创建 vector 对象。第二个程序在堆上创建整数对象。

这是我的代码:

#include <vector>
#include <stdio.h>

int main()
{
    long long unsigned bytes = 0;
    unsigned megabytes = 0;

    for (long long unsigned i = 0; ; i++) {

        std::vector<int>* pt1 = new std::vector<int>(100000,10);

        bytes += sizeof(*pt1);
        bytes += pt1->size() * sizeof(pt1->at(0));
        megabytes = bytes / 1000000;

        if (i >= 1000 && i % 1000 == 0) {
            printf("There are %d megabytes on the heap\n", megabytes);
        }

    }
}

在出现 bad_alloc 错误之前,此代码的最终输出是:“堆上有 2000 MB”

在第二个程序中:

#include <stdio.h>

int main()
{
        long long unsigned bytes = 0;
        unsigned megabytes = 0;

        for (long long unsigned i = 0; ; i++) {

           int* pt1 = new int(10);

           bytes += sizeof(*pt1);
           megabytes = bytes / 1000000;

           if (i >= 100000 && i % 100000 == 0) {
              printf("There are %d megabytes on the heap\n", megabytes);
        }

    }
}

在出现 bad_alloc 错误之前,此代码的最终输出是:“堆上有 511 MB”

两个程序的最终输出有很大不同。我对免费商店有什么误解吗?我认为这两个结果大致相同。

最佳答案

很可能 pointers returned by new on your platform are 16-byte aligned .

如果 int4 字节,这意味着对于每个 new int(10) 您将获得 4 个字节并生成 12 个字节无法使用。

仅此一点就可以解释从小分配中获取 500MB 可用空间与从大分配中获取 2000MB 可用空间之间的差异。

最重要的是,跟踪分配的 block (至少是它们的大小以及它们是否空闲或正在使用)会产生开销。这与系统的内存分配器非常相关,但也会产生每次分配的开销。请参阅 https://sourceware.org/glibc/wiki/MallocInternals 中的“什么是 block ”有关 glibc 分配器的说明。

关于c++ - 堆上的内存是如何耗尽的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58361081/

相关文章:

c++ - Qt 5 应用程序的平面目录部署?

c++ - 产生 NaN 和 -inf 值的矩阵特征和

pointers - atomic.AddInt64 导致无效的内存地址或零指针取消引用

iphone - "Release>nil>init"更新 NSMutableDictionary 的可接受方法?

c - C、Linux 中线程池内存不足

c++ - C++中虚拟函数的构造函数内部动态绑定(bind)

java - Java中的线程何时从内存中删除?

java - Android中如何释放内存?

java - 使用接受文件的 Spring Controller 防止内存不足错误

c++ - Google Mocks 测试输出到 XML 不起作用