C/C++程序中常见的与内存有关的错误

1. 间接引用坏指针

int main()
{
    int val;
    scanf("%d", val);  // Error!
    scanf("%d", &val); // Ok!
    return 0;
}

2. 读未初始化的内存

int main()
{
    int n = 10;
    int* y = (int*) malloc(n * sizeof(int));
    for (int i = 0; i < n; i++) 
    {
        y[i] += i; // Error! y[i] != 0. Let y[i] = 0 or use calloc().
    }
    return 0;
}

3. 允许栈缓冲区溢出

int main() 
{
    char buf[64];
    gets(buf); // Error! Use fgets().
    return 0;    
}

4. 假设指针和它们指向的对象是相同大小的

int main()
{
    int n = 10;
    int m = 5;
    int** A = (int**) malloc(n * sizeof(int)); // Error! Should be sizeof(int*), sizeof(int*) could be 4 bytes or 8 bytes.
    for (int i = 0; i < n; i++)
    {
        A[i] = (int*) malloc(m * sizeof(int));
    }
    return 0;
}

5. 造成错位错误,数组越界

int main()
{
    int a[10];
    for (int i = 0; i <= 10; i++)  // Error! Should be i < 10.
    {
        a[i] = i;
    }
    return 0;
}

6. 引用指针,而不是它所指向的对象

int main()
{
    int a[1] = 10;
    int* p = a[0];
    *p--;  // Error! Should be (*p)--.
    cout << *p << endl;
    return 0;
}

7. 误解指针运算

int* search(int *p, int val)
{
    while (*p && *p != val)
        p += sizeof(int);  // Error! Should be p++.
    return p;
}

8. 引用不存在(临时)的变量

int *stackref()
{
    int val;
    return &val;  // Error! Returned a pointer to local variable.
}

9. 引用空闲堆块中的数据

int main()
{
    int* x = (int*) malloc(100);
    free(x);
    x[0];  // Error! x[0] is in a free block.
    return 0;
}

10. 引起内存泄漏

void leak(int n)
{
    int* x = (int*) malloc(n * sizeof(int));
    return;  // Error! Should use free();
}

猜你喜欢

转载自www.cnblogs.com/yiluyisha/p/9226578.html