我有以下代码,其中一个数组是在一个函数中动态声明的。以下程序在Visual Studio 2013中完美编译。但是,在运行时,代码在打印数组期间中断,并显示以下错误代码:
检测到严重错误c0000374 WaveEquation1D.exe已触发断点。 WaveEquation1D.exe中0x771CC7C9(ntdll.dll)的第一次机会异常:0xC0000374:堆已损坏(参数:0x771F8890)。
WaveEquation1D.exe中0x771CC7C9(ntdll.dll)的未处理异常:0xC0000374:堆已损坏(参数:0x771F8890)。
发生了什么事?请帮助
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int solver(double i, double v, double c, double L, int Nx, double C1, double t);
int solver(double i, double v, double c, double L, int Nx, double C1, double t)
{
double *msh = new double(Nx);
double delta = L / Nx;
int count = 0;
for (int i = 0; i <= Nx; i++)
{
msh[i] = 0.0;
}
for (int i = 0; i <= Nx; i++)
{
msh[i] += delta*count;
count++;
}
for (int i = 0; i <= Nx; i++)
{
cout << msh[i] <<endl;
}
delete[] msh;
//
return 0;
}
int main()
{
cout << "Hello"<<endl;
int size;
int j;
j = solver(1, 0, 0, 20.0, 20, 0, 1);
_getch();
return 0;
}
答案 0 :(得分:5)
double *msh = new double(Nx);
应该是
double *msh = new double[Nx];
否则你只是在1双上分配一个指针。
其他用户评论
时情况有误for (int i = 0; i <= Nx; i++)
应该是
for (int i = 0; i < Nx; i++)
更好的解决方案:声明一个double的向量
#include <vector>
std::vector<double> msh(Nx); // instead of new double
当然,当delete
变量超出范围时,vector
无需自动处理释放。
并使用msh.at(i)
访问您的元素,因此如果向量超出范围,则会引发断言(性能受到影响,但也会出现错误)