带删除的内存管理

Memory Management with delete

我有一个小程序:

#include <iostream>

using namespace std;

void inputArray(int*& p, int& n);
void print(int *p, int n);

int main() {
    int size = 0;
    int *arr;
    inputArray(arr, size);
}

void inputArray(int*& p, int& n) {
    int *q = new int[n]; int m = n;
    for (int i = 0; i < n; ++i) q[i] = p[i];
    cout << endl << "How many numbers to insert? "; cin >> n;
    delete p; 
    p = new int[n + m];
    for (int i = 0; i < m; ++i) p[i] = q[i];
    for (int i = 0; i < n; ++i) cin >> p[i + m];
    n += m;
}

这个程序的目的是插入一个整数数组。但是,当我尝试在 Ubuntu 上使用 Code::Blocks 运行 程序时,它经常说:

free(): invalid pointer: 0xb7646000 ***

输入n后

但是,当我删除 delete p; 时,一切正常。但是,我还是想知道问题所在。谁能告诉我问题出在哪里?

您正在分配数组中的元素 p

for (int i = 0; i < n; ++i) q[i] = p[i];

但是 p 从未分配或分配任何值

int *arr;
inputArray(arr, size);   // Here "arr" is "p" within the function

这构成了未定义的行为,并且将如此行事。

 delete p; 

您从未分配过 p,所以当您尝试 free p 时,它不能。 这就像试图访问别人的银行帐户,您可能拥有 name,但您不能 免费 他的 money.

- 只是为了咆哮 - ,尝试使用更冗长的变量名,它永远不会伤害。尤其是如果你在一年内喝醉了审查你的代码。