麻烦大家看看我这个代码为何出现Access violation reading location 0x00000010.的错误
本帖最后由 superwavelet 于 2011-12-05 08:09:12 编辑 Shape类里面定义:
public:
const CoordinateSystem* parent() const { return parent_; }
CoordinateSystem类里面定义public函数:
Matrix3x3 CoordinateSystem::local_from_parent() const
{
Matrix3x3 m;
m.assignIdentity();
m.preScale(scale[0],scale[1]);
m.preRotate(orientation);
m.preTranslate(origin[0],origin[1]);//p e -1(right)
Matrix3x3 InverseM=m.inverse();
return InverseM;
}
Matrix3x3类里面定义
void Matrix3x3::preScale(float x, float y)
{
Matrix3x3 m;
m.assignScale(x,y);
preMultiply(m);
}
UnitDisk 类继承Shape类
class UnitDisk : public Shape //UnitDisk 里面既没有申明parent()函数,也没有实现这个函数.
bool UnitDisk::contains (Point2 target_WCS)
{
target_LCS = (parent()->local_from_parent());
}
我注意到 UnitDisk都是有已经生成了对象, parent()也有对应的对象,但是就是不知道 从为contains函数开始运行,啥运行到
m.preScale(scale[0],scale[1]);这一行就出现 错误:
Unhandled exception at exe: 0xC0000005: Access violation reading location 0x00000010.
[解决办法]
scale[2]没初始化或赋值吧
[解决办法]
下例s[2]的地址为0x00000010,此处的值比s[1]先入栈,但此地址无效,因为0到64k的地址范围是无效的,不能读。
你的scale[0],scale[1],scale[0]的地址分别为0x10,0x08,0x00
void f(float a,float b)
{
a+b;
}
int main()
{
double *s=0;
f(s[1],s[2]); // Access violation reading location 0x00000010.
return 0;
}
[解决办法]
更正:你的scale[2],scale[1],scale[0]的地址分别为0x10,0x08,0x00
要得到s[2]的值,得去这个地址去取,地址无效,所以取不到值