写点什么

Go/C++ 指针比较

作者:俞凡
  • 2025-09-01
    上海
  • 本文字数:1440 字

    阅读完需:约 5 分钟

本文比较了 Go 和 C/C++ 对指针的使用,理解 Go 指针的设计如何在保留 C/C++ 指针优点的基础上解决其带来的安全问题。原文:Pointers Made Painless: How Go Solves C/C++’s Biggest Headache



世界上很少有事物能在同一特性上同时兼具强大与脆弱的特质。在编程领域,如果要我举例的话,那就是 C/C++ 语言中的指针。


在系统编程领域,指针带来的好处毋庸置疑 —— 能够实现极高的运行速度和底层控制能力。


世界各地的开发者们已经用了 30-40 年的指针,所有事物都会不断变化发展,指针是否也应该随之发展呢?


倘若保留指针的功能,同时又能让其使用起来更加简便、减少出错的可能性,会怎样呢?这就有了 Go 语言,它旨在简化现代编程。

例 1:自动内存管理

Go:无内存泄漏

在 Go 中,内存管理由垃圾收集器处理,不需要手动分配或释放内存,从而防止内存泄漏。


package main
import "fmt"
type Person struct { Name string Age int}
func createPerson() *Person { return &Person{Name: "Alice", Age: 30} // 自动管理内存}
func main() { p := createPerson() fmt.Println(p.Name) // 不需要释放内存 }
复制代码

C/C++

在 C/C++ 中,必须手动管理内存,忘记释放内存会导致内存泄漏。


#include <iostream>#include <string>
struct Person { std::string Name; int Age;};
Person* createPerson() { return new Person{"Alice", 30}; // 手动分配内存}
int main() { Person* p = createPerson(); std::cout << p->Name << std::endl; // 忘记删除 p? 内存泄露! // delete p; }
复制代码

例 2:Nil 指针安全

Go:Nil 指针安全

在 Go 中,访问 nil 指针不会导致程序崩溃。相反,只会返回零值或 panic(如果试图解引用的话)。


package main
import "fmt"
type Person struct { Name string Age int}
func main() { var p *Person // p 是 nil if p != nil { fmt.Println(p.Name) // 检查 nil 是安全的 } else { fmt.Println("p is nil") // 优雅地处理 nil 指针 }}
复制代码

C/C++

在 C/C++ 中,解引用空指针会导致未定义行为,通常会导致崩溃(segmentation fault)。


#include <iostream>#include <string>
struct Person { std::string Name; int Age;};
int main() { Person* p = nullptr; // p is null std::cout << p->Name << std::endl; // 崩溃: null 指针解引用}
复制代码

例 3:更好的解引用方法

Golang

// Go: 用指针访问结构体字段type Person struct {    Name string    Age  int}
func main() { p := &Person{Name: "Alice", Age: 30} fmt.Println(p.Name) // 即使 'p' 是指针,也不需要 '->',只需要用 '.'}
复制代码

C/C++

// C++: 用指针访问结构体字段struct Person {    std::string Name;    int Age;};
int main() { Person* p = new Person{"Alice", 30}; std::cout << p->Name; // 'p' 是指针,需要通过 '->' 访问 delete p; // 别忘了释放内存!}
复制代码




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 2
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
Go/C++ 指针比较_c++_俞凡_InfoQ写作社区