3

(与这个问题有关。)

我有一个基类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 太久了,忘记了很多关于指针的知识,我认为这是我问题的根源......关于如何解决这个错误的任何建议?

4

4 回答 4

6

你用指向局部变量的指针填充了数组。这些仅在原始局部变量仍然有效时才有效。最有可能的是,您尝试访问的对象只是超出了范围。尝试在堆上分配它们,看看是否能解决问题。

于 2011-02-19T17:53:13.497 回答
4
Der1 d = Der1();

Der1在堆栈上构造一个实例。如果d在您打电话之前超出范围,您SomeFunction会遇到访问冲突。您需要使用 new 在堆上构造 Der1。

Der1* d = new Der1();

d如果您不再需要它或在程序结束时,您需要删除该实例:

delete d;
于 2011-02-19T17:54:34.760 回答
2

在以下之后:

Der1 d = Der1();
...
array[count] = &d;

一旦上述范围结束,您的对象 d 就会被销毁。这意味着您以后无法尝试通过以下方式访问:

array[i]->SomeFunction(x, y);

由于该位置的指针先前引用的对象现在消失了。

于 2011-02-19T17:54:57.283 回答
1
int result = array[i]->SomeFunction(x, y);

确保i小于 10 且大于或等于 0。

于 2011-02-19T17:51:02.057 回答