C++ new一个double数组,访问冲突。

watercubecn 2018-07-14 07:47:50
环境是VS2017。在一个函数开始时,new一个double数组:
double* non0basisFuns = new double[4];

调试不通过:
0x7707374C (ntdll.dll)处(位于 BSpline3Constructor.exe 中)引发的异常: 0xC0000005: 读取位置 0xFFFFFFF8 时发生访问冲突。
问题是,只有申请4个double时出现问题,当new double[3]、new double[5]时都没有问题。请问这是怎么回事?谢谢大家!
...全文
1228 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
watercubecn 2018-07-15
  • 打赏
  • 举报
回复
引用 5 楼 T20091 的回复:
应该不是这里的问题,把上下文都贴一下吧

多谢回复!
main()函数:

#include "Geometry.h" //这是自己写的几何类相关头文件
#include <iostream>
int main()
{
cBSpline3* testSpline = new cBSpline3; //3次B样条类,定义于Geometry.h中

cPoint* points = new cPoint[5]; //cPoint是表示点的类,定义于Geometry.h中

points[0].set(0, 0, 0); //给各个点赋值
points[1].set(3, 4, 0);
points[2].set(-1, 4, 0);
points[4].set(-4, 0, 0);
points[5].set(-4, -3, 0);

cVector startDir, endDir; //自己写的向量类,笛卡尔坐标系的x/y/z坐标
startDir.set(0, 0, 0); //给向量赋值
endDir.set(0, 0, 0);

testSpline->spline3_construct(points, 5, startDir, endDir, 3); //构建样条曲线的方法。根据点序列和两个切向量构建样条曲线

delete testSpline;
delete[] points;
system("pause");
return 0;
}


接下来是spline3_construct函数:

//返回值:成功返回0,出错返回1
int cBSpline3::spline3_construct(cPoint* pointList, int numOfPoints, cVector startDir, cVector endDir, int demension)
{

if (numOfPoints < 5) //至少应该有5个数据点,这样才会至少有1个非零、非1节点
{
return 1;
}
//删除旧的动态成员,在构建新的样条曲线之前,将曲线相关变量复位。B样条的信息由控制点序列和节点向量组成
if (controlPointList != NULL) //控制点数组,类型是cPoint* ,是cBSpline3类的属性
{
delete[] controlPointList;
controlPointList = NULL;
numOfControlPoints = 0;
}
if (knotVector != NULL) //节点向量,类型是double* , 是cBSpline3类的属性
{
delete[] knotVector;
knotVector = NULL;
numOfKnots = 0;
}

int i, j;
int span;
double* non0basisFuns = new double[4]; //调试的时候,到这里就出错了
double tempReal; //浮点数临时存储
double totalChordLength = 0; //总弦长
double* tempParam = new REAL[numOfPoints];
//接下来还用了Eigen库来做矩阵运算,很长,就不贴了。
watercubecn 2018-07-15
  • 打赏
  • 举报
回复
对不住各位回帖的同学了,我找到错误了,在main函数里面,申请了5个点的动态数组,6楼第9行到第13行赋值的时候,下标本应是0/1/2/3/4,被我写成了0/1/2/4/5,越界造成了bug。谢谢各位回帖。
watercubecn 2018-07-15
  • 打赏
  • 举报
回复
引用 7楼真相重于对错 的回复:
你的代码和你说的,是有差距的
main调用
testSpline->spline3_construct(points, 5, startDir, endDir, 3)
你贴的出错代码是
int cBSpline3::spline3_construct(cPoint* pointList, int numOfPoints)
{
两个参数形式都不一样。怎么让别人判断?
你这样的问题,最好自己一步一步,的慢慢调试?
您说的是三楼的代码吗?因为这函数后几个参数对结果没有影响,就没有写。
真相重于对错 2018-07-15
  • 打赏
  • 举报
回复
你的代码和你说的,是有差距的
main调用
testSpline->spline3_construct(points, 5, startDir, endDir, 3)
你贴的出错代码是
int cBSpline3::spline3_construct(cPoint* pointList, int numOfPoints)
{
两个参数形式都不一样。怎么让别人判断?
你这样的问题,最好自己一步一步,的慢慢调试?
冬南风 2018-07-14
  • 打赏
  • 举报
回复
应该不是这里的问题,把上下文都贴一下吧
watercubecn 2018-07-14
  • 打赏
  • 举报
回复
换了一台机器。还是这个位置出错。但是没有说访问冲突,只是说处罚了一个断点。“下面的框架可能不正确和/或缺失,没有为ucrtbased.dll加载符号”如下图:

我用了Eigen库,但是没有在解决方案中添加它的头文件,只是include了一下,不知道是不是这个原因。
看来还是不会用vs2017啊。。。求助!
watercubecn 2018-07-14
  • 打赏
  • 举报
回复
引用 2 楼 hdt 的回复:
再贴一些代码

多谢回复!上下文如下:

int cBSpline3::spline3_construct(cPoint* pointList, int numOfPoints)
{
int i, j;
int span;
double* non0basisFuns = new double[4]; //这里触发了异常,把4改成3/5/10/40等都没有触发异常
//这是一个拟合曲线的函数,参数中cPoint是自己写的描述坐标点的类:cPoint{double x; double y; double z;}
//...
}

也就是说,进入这个函数,申请一个动态数组,就出问题了。
真相重于对错 2018-07-14
  • 打赏
  • 举报
回复
再贴一些代码
watercubecn 2018-07-14
  • 打赏
  • 举报
回复
补充异常界面:

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧