带删除的内存管理
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
.
和 - 只是为了咆哮 - ,尝试使用更冗长的变量名,它永远不会伤害。尤其是如果你在一年内喝醉了审查你的代码。
我有一个小程序:
#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
.
和 - 只是为了咆哮 - ,尝试使用更冗长的变量名,它永远不会伤害。尤其是如果你在一年内喝醉了审查你的代码。