C++ 初学者常见错误及如何避免

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

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

开始课程

C++ 初学者最常见的错误



C++ 是一门强大但要求严格的语言。它赋予程序员对内存和性能的完全控制权,但这份自由需要以高度责任感为代价。初学者经常犯同样的错误,导致内存泄漏、未定义行为和难以发现的 bug。在本文中,我们将分析 C++ 初学者最常见的 4 个错误,并展示如何避免它们。



1. 内存泄漏和资源管理不当



最常见的问题是在 new 之后忘记调用 delete。结果导致内存未被释放,应用程序会“消耗”越来越多的资源。



错误示例:

void leakExample() {    int* ptr = new int(42);    // ... 一些代码 ...    // 忘记 delete ptr;}


每次调用此函数都会“丢失”4 个字节。在长期运行的程序中,这会导致内存耗尽。



正确的解决方案——RAII 和智能指针:

#include <memory>

void safeExample() { std::unique_ptr<int> ptr = std::make_unique<int>(42); // 退出函数时内存会自动释放}


对于独占所有权使用 std::unique_ptr,对于共享访问使用 std::shared_ptr。在现代 C++ 中永远不要使用裸 new 和 delete。



2. 指针和引用的混淆



初学者常常不理解 T* 和 T& 之间的区别。主要区别在于:引用不能是 nullptr,不能重新绑定,并且始终指向有效对象。



混淆示例:

void process(int* ptr) {    if (ptr) {        *ptr = 10; // OK    }}

int main() { int a = 5; process(&a); // 可以工作 process(nullptr); // 也“可以工作”,但可能是一个 bug}


这里函数接受一个指针,但从逻辑上讲它期望一个有效对象。最好使用引用:



void process(int& ref) {    ref = 10; // 始终安全}

int main() { int a = 5; process(a); // 明确且清晰 // process(nullptr); // 编译错误——这正是我们需要的!}


规则:在对象必须存在的地方使用引用。将指针留给可选参数或动态数组。



3. 忽略常量正确性



许多初学者忘记使用 const。这导致函数无法接受临时对象,并且编译器无法优化代码。



错误示例:

void printVector(std::vector<int>& vec) {    for (int v : vec) {        std::cout << v << " ";    }}

int main() { printVector({1, 2, 3}); // 错误!不能将临时对象绑定到非常量引用}


正确的解决方案:

void printVector(const std::vector<int>& vec) {    for (int v : vec) {        std::cout << v << " ";    }}

int main() { printVector({1, 2, 3}); // 可以工作!}


始终为不应修改的参数添加 const。这使代码更安全、更清晰。



4. 字符串使用不当和忘记 std::string



初学者经常使用 C 风格字符串 (char*) 并编写自己的函数来处理它们,尽管 C++ 中有强大的 std::string 类。



危险代码示例:

void unsafeConcat(char* dest, const char* src) {    strcat(dest, src); // 很容易缓冲区溢出!}

int main() { char buffer[10];

博客

书籍推荐