C++编程中的常见陷阱:你踩过几个?

发表时间: 2023-08-28 09:39

陷阱一:内存泄漏

#include <iostream>int main() {    while (true) {        int* num = new int;    }    return 0;}

这段代码会不断分配内存,但从不释放。为避免内存泄漏,应该在不需要使用动态分配的内存时,使用delete释放它。

陷阱二:悬空指针

#include <iostream>int main() {    int* num;    *num = 10;    std::cout << *num << std::endl;    return 0;}

在这个例子中,num是一个未初始化的指针,尝试对其进行解引用会导致未定义的行为。应该始终将指针初始化为一个有效的地址,或者使用动态分配的内存。

陷阱三:数组越界

#include <iostream>int main() {    int arr[5] = {1, 2, 3, 4, 5};    std::cout << arr[5] << std::endl;    return 0;}

在这里,数组下标越界会访问到无效的内存位置,导致未定义的行为。要确保数组下标始终在有效范围内。

陷阱四:空指针解引用

#include <iostream>int main() {    int* num = nullptr;    std::cout << *num << std::endl;    return 0;}

解引用空指针会导致未定义的行为。在使用指针之前,始终要检查其是否为非空。

陷阱五:浮点数比较

#include <iostream>int main() {    double a = 0.1 + 0.2;    double b = 0.3;    if (a == b) {        std::cout << "Equal" << std::endl;    } else {        std::cout << "Not Equal" << std::endl;    }    return 0;}

由于浮点数的精度问题,直接比较它们是否相等可能会导致意外的结果。应该使用一个很小的误差范围来进行比较。

陷阱六:字符串处理

#include <iostream>#include <cstring>int main() {    char str1[] = "Hello";    char str2[] = "World";    char result[10];    strcpy(result, str1);    strcat(result, str2);    std::cout << result << std::endl;    return 0;}

上述代码使用了C风格的字符串处理函数,如果操作的字符串长度超过了目标数组的容量,会导致缓冲区溢出。应该使用std::string来更安全地进行字符串操作。

这些只是C++中可能遇到的一些典型陷阱。你在日常工作中遇到过以上坑吗?如果你遇到过其他坑,请在评论区留言,以便他人避坑。