free():仅在一种情况下指针无效
free(): Invalid pointer in only one case
当我运行这段代码时:
#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
相关文章:
- 两种情况下的输出不应该相同吗?
- 为什么'const'在这两种情况下的行为不同?
- 在哪种情况下,C++会在编译时进行数组边界检查?
- free():仅在一种情况下指针无效
- 在两种情况下,铸造的工作方式不同
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 我如何仅在一种情况下或某些情况下专业攻击效果
- 在哪种情况下,可以在堆栈上分配
- 空格很重要的另一种情况(也许?
- 程序在没有调试符号的情况下崩溃,运行良好(两种情况下都没有优化或任何内容)
- 在每种情况下都执行“std::set”对元素进行排序
- 为什么模板参数只能在一种情况下推导
- C++为什么在一种情况下保存到文件有效,而另一种情况则无效
- 在一种情况下调用构造函数的顺序C++
- 为什么在使用C++模板的这两种情况下会出现差异
- c在这两种情况下是如何工作的以及有什么不同
- 为什么两种情况下的行为不同1.int i=1,2,3;和第二.int i;i=1,2,3;
- 如何在一种情况下实现具有显著不同实现的类
- 为什么在头文件中使用私有内部类作为参数会出错,而在另一种情况下在调用函数中会出错?
- 为什么在一种情况下模板参数需要volatile,而在另一种情况下不需要