(与this question相关。)
我有一个基类Base
和两个派生类Der1
和Der2
。 (请参阅基本实现的链接问题。每个都有许多公共属性。)在我的程序中,我创建了一个Base
数组,如下所示:
Base *array[10];
int count = 0; // program-wide count of how many objects are in the array
然后我在其中填写Der1
和Der2
的实例,如下所示:
Der1 d = Der1();
d.x = 0; // Filling in public properties
d.y = 1;
d.z = 3;
array[count] = &d;
count++;
几乎相同的代码用于Der2
。
很久以后,我使用数组调用这些类中定义的函数:
int result = array[i]->SomeFunction(x, y);
我的代码编译得很好,但是当我尝试运行它时,我在program.exe中得到“0x00232d60处的未处理异常:0xC000005:访问冲突读取位置0x04064560。”
当我看一下我想要访问的数组中的对象时,所有属性的值都是0.0000而不是它们应该是什么。还有两个double
- 类型数组,看起来最后几个元素未初始化(“1.572398880752e-311#DEN”或“-9.2559631349317831e + 061”或类似)。
我一直在做.NET太长时间并忘记了很多关于指针的知识,我假设它是我的问题的根源......有关如何解决这个错误的任何建议吗?
答案 0 :(得分:6)
您使用指向局部变量的指针填充数组。只要原始局部变量仍然有效,它们才有效。最有可能的是,您尝试访问的对象超出了范围。尝试在堆上分配它们,看看是否能解决问题。
答案 1 :(得分:4)
Der1 d = Der1();
在堆栈上构造Der1
的实例。如果d
在调用SomeFunction
之前超出范围,则会导致访问冲突。您需要使用new。
Der1* d = new Der1();
如果您不再需要它或在程序结束时需要删除d
实例:
delete d;
答案 2 :(得分:2)
以下之后:
Der1 d = Der1();
...
array[count] = &d;
上述范围结束后,您的对象d将被销毁。这意味着你以后不能尝试访问这样的东西:
array[i]->SomeFunction(x, y);
由于指针在该位置之前引用的对象现在已经消失。
答案 3 :(得分:1)
int result = array[i]->SomeFunction(x, y);
确保i
小于10,且大于或等于0.