free():仅在一种情况下指针无效

free(): Invalid pointer in only one case

本文关键字:一种 情况下 无效 指针 free      更新时间:2023-10-16

当我运行这段代码时:

#include <iostream>
using namespace std;
int main()
{
char *a = NULL;
char *b = NULL;
int n;
cin >> n;
a = new char[n];
b = new char[n];
cin >> a;
cin >> b;
cout << "Freeing a" << endl;
delete []a;
cout << "Freeing b" << endl;
delete []b;
a = NULL;
b = NULL;
}

对于以下输入:

168
110101001110100001000100000000101001100000111000110000011010110001011101000000011000101111100011010011101000001001001101000100000001111001101011100101101001111001110100
110101001110000001000100000000100001100000110100100100011110100001011101000000011000111101101010010011101110001101001101000100000001011001101011100101101001111001110100

我得到以下输出:

Freeing a
Freeing b
free(): invalid pointer
Aborted (core dumped)

我看到程序无法删除分配给b的内存。

观察:

它仅在这种情况下失败。似乎运行长度与 168 不同的其他输入。

编辑:

未考虑的空字符可能是错误。但是我没有收到此输入的任何错误:

10
1010101010
1010101010

对于第二个指针,删除总是失败。

使用operator>>字符读入动态数组时,请使用std::setw()告诉operator>>数组的实际大小,这样它就不会溢出数组:

#include <iomanip>
cin >> setw(n) >> a;
cin >> setw(n) >> b;

否则,请改用istream::read()istream::get()

cin.read(a, n);
cin.read(b, n);
cin.get(a, n);
cin.get(b, n);

无论哪种方式,请确保数组足够大以容纳您要读取的字符数 + 空终止符!上面的读取在读取最多字符数width-1输出一个空终止符。

cin >> n;
++n; // for null terminator