C++中malloc和new的内存使用差异

问题描述 投票:0回答:1

我观察到在简单的 C++ 程序中使用

malloc
与使用
new
时总内存分配存在差异,如 Valgrind 报告的那样。下面是我的程序的两个版本以及相应的 Valgrind 输出。

使用

malloc
的版本:

#include <cstdlib>
int main() {
    int* a = (int *)malloc(4);
    return 0;
}

Valgrind 输出为

malloc
:

==34673== HEAP SUMMARY:
==34673==     in use at exit: 4 bytes in 1 blocks
==34673==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated

使用

new
的版本:

int main() {
    int* a = new int;
    return 0;
}

Valgrind 输出为

new
:

==35295== HEAP SUMMARY:
==35295==     in use at exit: 4 bytes in 1 blocks
==35295==   total heap usage: 2 allocs, 1 frees, 72,708 bytes allocated

我很困惑为什么这两种情况报告的“总堆使用量”有如此显着的差异。具体来说,为什么

new
版本报告的分配字节数比
malloc
版本多得多?这是否与 C++ 使用
new
时内部处理内存管理的方式有关?

此外,即使我只使用这段代码,也会有 72,704B 的开销:

#include <iostream>
int main() {
    return 0;
}

这个开销似乎与动态内存管理有关,但我不明白为什么它如此重要。

g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

valgrind --version
valgrind-3.18.1

我用来构建

g++ program_name.cpp
然后
valgrind ./a.out

的命令
c++ memory-management malloc valgrind new-operator
1个回答
0
投票

首先,malloc是一个简单的C函数,它分配指定大小的内存块并返回指向它的指针。因此,malloc 的开销是最小的,并且直接对应于所请求的内存。

但是,当你使用new时,new是一个运算符,而不仅仅是一个函数。与malloc相比,它有更多的职责。 因为它不仅分配内存,而且还调用对象的构造函数。因此 new 的实际内存分配可能不仅仅涉及为 int 请求的 4 个字节。

© www.soinside.com 2019 - 2024. All rights reserved.