首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从派生类的数组读取访问冲突

从派生类的数组读取访问冲突
EN

Stack Overflow用户
提问于 2011-02-20 01:46:12
回答 4查看 639关注 0票数 3

(与this question相关。)

我有一个基类Base和两个派生类Der1Der2。(有关基本实现,请参阅链接问题。每个都有许多公共属性。)在我的程序中,我创建了一个Base数组,如下所示:

代码语言:javascript
复制
Base *array[10];
int count = 0; // program-wide count of how many objects are in the array

然后,我用Der1Der2的实例填充它,如下所示:

代码语言:javascript
复制
Der1 d = Der1();
d.x = 0; // Filling in public properties
d.y = 1;
d.z = 3;
array[count] = &d;
count++;

Der2使用了几乎相同的代码。

稍后,我将使用数组来调用这些类中定义的函数:

代码语言:javascript
复制
int result = array[i]->SomeFunction(x, y);

我的代码编译得很好,但是当我尝试运行它时,我得到了"Unhandled at 0x00232d60 in program.exe: 0xC000005: Access violation reading 0x04064560“。

当我查看我试图访问的数组中的对象时,所有属性的值都是0.0000,而不是它们应该是的值。还有两个double-type数组,看起来最后几个元素是未初始化的("1.572398880752e-311#DEN“或"-9.2559631349317831e+061”或类似)。

我做.NET已经太久了,忘记了很多关于指针的知识,我想这就是我问题的根源……对于如何修复这个错误,有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-20 01:54:35

代码语言:javascript
复制
Der1 d = Der1();

在堆栈上构造Der1的实例。如果在调用SomeFunction之前d超出了作用域,就会出现访问冲突。您需要使用Der1在堆上构造新的。

代码语言:javascript
复制
Der1* d = new Der1();

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

代码语言:javascript
复制
delete d;
票数 4
EN

Stack Overflow用户

发布于 2011-02-20 01:53:13

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

票数 6
EN

Stack Overflow用户

发布于 2011-02-20 01:54:57

在以下内容之后:

代码语言:javascript
复制
Der1 d = Der1();
...
array[count] = &d;

一旦上述作用域结束,你的对象d就会被销毁。这意味着您不能尝试在以后使用类似以下内容进行访问:

代码语言:javascript
复制
array[i]->SomeFunction(x, y);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5052442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档