内存管理删除

时间:2015-04-27 17:33:20

标签: c++ memory-management

我有一个小程序:

#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;时,一切正常。但是,我仍然想知道这个问题。任何人都能说出问题所在吗?

2 个答案:

答案 0 :(得分:4)

 delete p; 

您从未分配过p,因此当您尝试free p时,它不会。 这就像尝试访问其他人的银行帐户一样,您可能拥有name,但您不能免费他的money

- 只是为了咆哮 - ,尝试使用更详细的变量名称,它永远不会伤害。特别是如果你醉酒 - 在一年内审查你的代码。

答案 1 :(得分:3)

您正在分配数组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

这构成了未定义的行为,并且表现得如此。