new/delete操作符
new
分配内存,delete
释放内存new[]
和delete[]
int* ptr = new int(10); // 分配单个int
int* arr = new int[10]; // 分配数组
delete ptr; // 释放单个
delete[] arr; // 释放数组
malloc/free与new/delete的区别
malloc/free
是C库函数,不调用构造/析构函数new/delete
是C++操作符,会调用构造/析构函数unique_ptr
std::unique_ptr<int> uptr(new int(10));
auto uptr2 = std::move(uptr); // 所有权转移
shared_ptr
std::shared_ptr<int> sptr1 = std::make_shared<int>(20);
auto sptr2 = sptr1; // 引用计数增加
weak_ptr
std::weak_ptr<int> wptr = sptr1;
if(auto tmp = wptr.lock()) {
// 使用临时shared_ptr访问资源
}
自定义内存分配器
void* operator new(size_t size) {
void* p = malloc(size);
if(!p) throw std::bad_alloc();
return p;
}
void operator delete(void* p) noexcept {
free(p);
}
内存池技术
使用valgrind检测内存泄漏
valgrind --leak-check=full ./your_program
pmap查看内存映射
pmap -x <pid>
使用mlock锁定内存
mlock(ptr, size); // 锁定
munlock(ptr, size); // 解锁
内存对齐分配
void* aligned_alloc(size_t alignment, size_t size);
posix_memalign(&ptr, alignment, size);
使用jemalloc/tcmalloc替代glibc malloc
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1 ./your_program
大页内存(Huge Pages)
// 在程序启动前设置
// echo 20 > /proc/sys/vm/nr_hugepages
void* ptr = mmap(NULL, size, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);
NUMA感知内存分配
#include <numa.h>
void* numa_alloc_onnode(size_t size, int node);
通过合理运用这些技巧,可以显著提高Linux环境下C++程序的内存管理效率和安全性。