我是C ++的新手,我试图让用户继续将双打输入数组,当用户输入-1时程序停止。我的代码有效,但当12个项目添加到数组时,我得到了这些错误:
*** glibc检测到*** ./exercise2:双重免费或损坏(退出):0x00000000010aa070 ***
======= Backtrace:=========
和
中止(核心倾销)
这是我的代码:
int main(){
int size=5;
int i=0;
double *numbers = new double[size];
cout<<"Enter your double:"<<endl;
while(1){
double *numbers2=new double[size];
cin>>numbers[i];
if(i>=size-1){
size=size*2;
memcpy(&numbers2, &numbers, size);
delete[]numbers;
numbers=numbers2;
}
if(numbers[i]==-1){
break;
}
cout<<numbers[i];
i++;
}
}
答案 0 :(得分:5)
我建议简化问题并使用std::vector
#include <vector>
int main()
{
std::vector<double> numbers;
// get numbers and push into vector if valid
double x;
cin >> x;
numbers.push_back(x):
}
答案 1 :(得分:0)
有几个问题:
1)size
可以是数组中元素的数量,也可以是数组的内存大小。目前没有double
的大小为1个内存单元的架构。
2)删除数组后,确实应该用新计算的大小重新分配。否则,写入已删除的内存是未定义的行为。在这种情况下,它可能会导致不好的事情发生,比如段错误。
3)比较浮点值是否存在问题。
我稍微重写了代码以解决所有这些问题。
using namespace std;
int main()
{
int size=5;
double *numbers = new double[size];
cout << "Enter your double:" << endl;
for (int i=0; ; ++i)
{
cin >> numbers[i];
if (i >= size-1)
{
size *= 2;
double *numbers2 = new double[size];
if (!numbers2)
{
cerr << "failed allocating memory" << endl;
exit(1);
}
memcpy (numbers2, numbers, sizeof double * (size/2));
delete[] numbers;
numbers = numbers2;
}
// compare for -1 within epsilon of 1e-7
if (abs (numbers[i] + 1) <= 1e-7)
break;
cout << numbers[i];
}
}