C++与Go系列之内存篇
C++ 提供了丰富的内存管理功能,从手动内存管理到自动内存管理都有涉及。
动态内存分配
new
和 delete
:用于分配和释放单个对象。
cppint* ptr = new int; // 分配一个int
delete ptr; // 释放内存
new[]
和 delete[]
:用于分配和释放数组。
cppint* arr = new int[10]; // 分配一个int数组
delete[] arr; // 释放内存
C风格的内存管理函数
malloc
:分配指定字节数的内存,但不会初始化内存。
cpp#include <cstdlib>
int* ptr = (int*)malloc(sizeof(int) * 10); // 分配一个包含10个int的数组
if (ptr == NULL) {
// 处理分配失败的情况
}
// 使用内存
free(ptr); // 释放内存
calloc
:分配指定数量的元素并初始化为零。
cppint* ptr = (int*)calloc(10, sizeof(int)); // 分配并初始化包含10个int的数组
if (ptr == NULL) {
// 处理分配失败的情况
}
// 使用内存
free(ptr); // 释放内存
realloc
:重新分配内存大小。
cppint* ptr = (int*)malloc(sizeof(int) * 10); // 分配一个包含10个int的数组
if (ptr == NULL) {
// 处理分配失败的情况
}
ptr = (int*)realloc(ptr, sizeof(int) * 20); // 重新分配大小为20个int的内存
if (ptr == NULL) {
// 处理重新分配失败的情况
}
// 使用内存
free(ptr); // 释放内存
内存泄漏
智能指针
std::unique_ptr
:独占所有权的智能指针,内存会在指针销毁时自动释放。
cppstd::unique_ptr<int> ptr(new int(10));
std::shared_ptr
:共享所有权的智能指针,引用计数为零时释放内存。
cppstd::shared_ptr<int> ptr1 = std::make_shared<int>(10);
std::shared_ptr<int> ptr2 = ptr1; // 共享内存
std::weak_ptr
:不增加引用计数的智能指针,用于打破循环引用。
cppstd::weak_ptr<int> weakPtr = ptr1;
RAII(资源获取即初始化)
std::vector
)使用RAII管理内存。Go语言提供了自动化的内存管理,主要依赖于垃圾回收(Garbage Collection)。
自动内存管理
new
或make
函数分配内存。
goptr := new(int) // 分配一个int
arr := make([]int, 10) // 分配一个int数组
垃圾回收器
GOGC
)来影响垃圾回收的频率。
goruntime.GC() // 手动触发垃圾回收
内存泄漏
pprof
工具分析和调试内存使用。
goimport (
"runtime/pprof"
"os"
)
func main() {
f, _ := os.Create("memprofile")
pprof.WriteHeapProfile(f)
f.Close()
}
内存优化
sync.Pool
)重用对象,减少垃圾回收压力。
govar pool = sync.Pool{
New: func() interface{} {
return new(bytes.Buffer)
},
}
buf := pool.Get().(*bytes.Buffer)
buf.Reset()
pool.Put(buf)
手动 vs 自动
工具与调试
Valgrind
)检测内存问题。pprof
)进行内存分析和优化。内存优化策略
总结来说,C++和Go在内存管理方面各有优劣,选择合适的内存管理方法需要根据具体的应用场景和需求来决定。
本文作者:phae
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!