我有以下代码,其中在函数中动态声明数组。以下程序在 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;
}
最佳答案
double *msh = new double(Nx);
应该是
double *msh = new double[Nx];
否则你只是在 1 个 double 上分配一个指针。
正如其他用户评论的那样,条件是错误的
for (int i = 0; i <= Nx; i++)
应该是
for (int i = 0; i < Nx; i++)
更好的解决方案:声明一个 double vector
#include <vector>
std::vector<double> msh(Nx); // instead of new double
不需要删除
,当然,当变量超出范围时,vector
会自动处理释放。
并使用msh.at(i)
访问您的元素,因此如果 vector 超出范围,则会引发断言(性能会受到一点影响,但也会出现错误)
关于c++ - 0x771CC7C9 (ntdll.dll) 处未处理的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39324918/