返回

C++ 中如何获取 `new` 分配的内存块大小?

windows

获取 new 分配的内存块大小

引言

在 C++ 中,new 运算符是一个强大的工具,用于在堆上动态分配内存。了解如何获取 new 分配的内存块大小对于优化内存使用和避免内存泄漏至关重要。

方法

1. 使用 sizeof 运算符

sizeof 运算符返回变量或类型的大小,包括 new 分配的内存块。只需获取分配变量的 sizeof 即可。

2. 使用 std::malloc_size 函数

std::malloc_size 函数专门用于返回分配给指针的内存块大小(以字节为单位)。

3. 使用调试器

大多数调试器都提供查看分配给指针的内存块大小的方法。例如,在 Visual Studio 中,您可以右键单击指针变量并选择“查看对象”。

注意事项

  • sizeof 返回分配给变量本身的内存大小,而不包括可能分配给该变量引用的对象的大小。
  • std::malloc_size 返回分配给指针的整个内存块的大小,包括可能分配给该指针引用的对象的大小。
  • 调试器显示的大小可能包括一些开销,例如对齐和管理数据结构。

示例

以下示例演示了如何使用 sizeofstd::malloc_size 获取 new 分配的内存块大小:

int* ptr = new int;

std::cout << "Sizeof: " << sizeof(*ptr) << std::endl;
std::cout << "std::malloc_size: " << std::malloc_size(ptr) << std::endl;

输出:

Sizeof: 4
std::malloc_size: 8

其他方法

对于更高级的用例,可以使用其他方法获取 new 分配的内存块大小:

  • 使用 std::aligned_storage 允许指定特定对齐方式的内存块。
  • 使用 std::pmr 提供用于内存资源管理的扩展功能。
  • 使用工具: 例如 valgrindaddress sanitizer,这些工具可以帮助检测内存问题。

最佳实践

  • 只在需要时分配内存: 避免不必要的内存分配。
  • 及时释放内存: 使用 deletedelete[] 释放分配的内存,防止内存泄漏。
  • 监视内存使用: 使用调试器或分析工具监视内存使用情况,并根据需要进行优化。

常见问题解答

1. 如何防止内存泄漏?

  • 及时释放不再使用的内存。
  • 使用智能指针(例如 std::unique_ptr)或 RAII(资源获取即初始化)模式。

2. new 运算符和 malloc 函数有什么区别?

  • new 是 C++ 中的高级分配运算符,负责对象的生命周期管理。
  • malloc 是 C 语言中的底层分配函数,没有对象生命周期管理。

3. 如何释放 new 分配的内存?

  • 使用 deletedelete[] 运算符。

4. 如何在 C++ 中分配数组?

  • 使用 new[] 运算符:int* arr = new int[size];

5. 如何在 C++ 中释放数组?

  • 使用 delete[] 运算符。