我有一个小程序:
#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;
时,一切正常。但是,我仍然想知道这个问题。任何人都能说出问题所在吗?
答案 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
这构成了未定义的行为,并且表现得如此。