C++ 标准库提供了一系列功能强大的内存管理工具,帮助开发者更高效和安全地分配和管理内存。掌握这些功能可以显著减少内存泄漏和其他内存管理问题,提高程序的健壮性和性能。本文将详细介绍这些内存管理功能及其应用。
智能指针
智能指针是 C++11 引入的一个重要特性,用于自动管理动态内存的生命周期。在 C++ 标准库中,主要有三种智能指针:std::unique_ptr
、std::shared_ptr
和 std::weak_ptr
。
std::unique_ptr
std::unique_ptr
是一个独占所有权的智能指针,即同一时刻只能有一个指针拥有这块内存。它的主要优点是自动释放资源,避免内存泄漏。
#include <memory>
#include <iostream>
void uniquePtrExample() {
std::unique_ptr ptr(new int(10));
std::cout << *ptr << std::endl; // 输出 10
}
// 离开作用域时,内存会被自动释放
std::shared_ptr
std::shared_ptr
是一种共享所有权的智能指针,允许多个指针共享同一块内存。当最后一个shared_ptr
被销毁时,内存才会被释放。
#include <memory>
#include <iostream>
void sharedPtrExample() {
std::shared_ptr ptr1 = std::make_shared(20);
std::shared_ptr ptr2 = ptr1;
std::cout << *ptr1 << std::endl; // 输出 20
std::cout << *ptr2 << std::endl; // 输出 20
}
// 所有 shared_ptr 离开作用域时,内存会被自动释放
std::weak_ptr
std::weak_ptr
是一种弱引用,不会增加引用计数,主要用于解决共享指针的循环引用问题。它只能通过提升(lock)成 std::shared_ptr
来访问资源。
#include <memory>
#include <iostream>
void weakPtrExample() {
std::shared_ptr sptr = std::make_shared(30);
std::weak_ptr wptr = sptr;
if (auto locked = wptr.lock()) {
std::cout << *locked << std::endl; // 输出 30
}
}
// sptr 离开作用域时,内存会被自动释放
动态内存分配函数
C++ 标准库还提供了若干用于动态内存分配和管理的函数,如 malloc
、free
、new
和 delete
。
malloc 和 free
malloc
函数用于动态分配内存,返回一个指向已分配内存的指针。free
函数用于释放先前分配的内存。它们是 C 风格的内存管理函数,C++ 也可以使用。
#include <cstdlib>
#include <iostream>
void mallocExample() {
int* ptr = (int*)malloc(sizeof(int));
if (ptr != NULL) {
*ptr = 40;
std::cout << *ptr << std::endl; // 输出 40
free(ptr);
}
}
new 和 delete
new
运算符用于动态分配内存,并返回一个指向新分配对象的指针。delete
运算符用于释放先前分配的内存。它们是 C++ 风格的内存管理方式。
#include <iostream>
void newDeleteExample() {
int* ptr = new int;
*ptr = 50;
std::cout << *ptr << std::endl; // 输出 50
delete ptr;
}
内存对齐
对于高性能应用场景,内存对齐是一个重要的考虑因素。C++ 标准库提供了 std::aligned_alloc
函数来分配已特定对齐方式对齐的内存。
#include <cstdlib>
#include <new>
#include <iostream>
void alignedAllocExample() {
void* ptr = std::aligned_alloc(alignof(std::max_align_t), sizeof(int) * 10);
if (ptr != NULL) {
// 使用内存...
free(ptr);
}
}
通过使用这些内存管理功能,C++ 程序员能够更有效地利用内存资源,避免常见的内存管理问题,从而提高程序的健壮性和性能。