C++新手常犯的10个错误:如何避免代码崩溃

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么C++连老手都会搞砸,新手更是如此

C++是一门毫不留情的语言。它赋予你对内存的完全控制权,但也要求绝对的纪律性。如果你刚开始学习C++,很可能已经遇到过程序编译成功但运行时崩溃,或者(更糟糕的是)程序没有任何错误提示却运行不正确的情况。这不是你的错——这是这门语言的本质。但我们可以帮你避免所有新手都会踩到的常见陷阱。

本文将分析学习C++时的10个关键错误,这些错误会让你的代码变成内存泄漏和未定义行为的噩梦。开始吧!



1. 忘记释放内存:经典的泄漏问题

C++新手最常见的错误——通过new分配动态内存后忘记使用delete。程序像吸尘器一样吞噬内存,而你甚至毫无察觉。

错误示例:

int* ptr = new int(42);// ... 大量代码 ...// 忘记:delete ptr;

结果:内存泄漏。程序能运行,但每次调用都会消耗更多资源。在现代项目中这是不可接受的。

如何修复:

  • 使用智能指针(std::unique_ptr、std::shared_ptr)——它们会自动释放内存。
  • 如果必须使用new/delete——始终在最后一次使用后立即添加delete。
#include <memory>std::unique_ptr<int> ptr = std::make_unique<int>(42);// 离开作用域时内存会自动释放


2. 在全局作用域使用using namespace std;

这行代码就像一颗定时炸弹。在小型教学示例中它没问题,但在实际项目中会导致命名冲突。

问题:

#include <iostream>#include <vector>using namespace std;

// 一年后项目中出现了自己的vector类class vector { ... }; // 编译错误!

std中的名称(例如vector、cout)变成了全局的,任何与你同名的类都会引发冲突。

更好的做法:

  • 显式写出std::cout、std::vector。
  • 或者只对特定名称使用using std::cout;。


3. 未定义行为:自掘坟墓

学习C++时最阴险的错误是未定义行为(UB)。编译器不会报错,程序可能正常运行,也可能格式化你的硬盘。开个玩笑,但离真相不远。

UB示例:

  • 数组越界:int arr[5]; arr[10] = 42;
  • 解引用空指针:int* p = nullptr; *p = 5;
  • 使用未初始化的变量。
int x; // 未初始化std::cout << x; // UB:可能输出垃圾值、0或导致崩溃

建议:始终初始化变量。使用std::array或std::vector代替原始数组——它们会检查边界(在调试模式下)。



4. 混淆指针和引用

新手常常分不清int* p和int& ref的区别。错误:试图重新绑定引用,或忘记解引用指针。

典型错误:

void change(int* p) {    p = new int(10); // 修改的是指针的局部副本,原指针未改变}

int main() { int* ptr = nullptr; change(ptr); std::cout << *ptr; // UB:ptr仍然是nullptr}

正确做法:通过引用传递指针(int*& p),或者如果不需要改变地址则使用引用。

博客

书籍推荐