2014-11-05 26 views
-1

我有一个Ellipsoid结构,它是Object结构的派生物。基本上,我想在Scene结构中创建一个Object [3] [13]指针数组,我可以指向不同的Object衍生物。在函数中传递继承的类数组会创建内存泄漏?

struct Ellipsoid : public Object { 
     //... 
} 

在主要功能:

Ellipsoid ellipsoids[13]; 
addEllipsoids(3, ellipsoids); // this fills the array with valid ellipsoids, everything seems to be fine up until this point 

// printing the contents here, everything is good 

scene.addObjects(ellipsoids); 

这里打印 “椭圆” 阵列后,一切似乎都不错。

在场景结构

struct Scene{ 
    int arr_num; 
    Object* objects[3]; 

    void addObjects(Object* o){ 
     // printning the o[0], o[1], ... contents here, getting garbage.. 
     objects[arr_num++] = o; 
} 

当我在这里打了* O含量(从0..12)甚至在我将它们添加到对象数组,我得到讨厌的内存垃圾结果。

这是作业,我不能使用std :: vector和这样的东西,只有非常基本的东西。我真的不知道这里有什么问题。

+0

可能重复[?可以将指针基点至派生对象的数组] (http://stackoverflow.com/questions/7196172/can-a-pointer-to-base-point-to-an-array-of-derived-objects) – user2079303 2014-11-05 13:14:17

+0

如果你从课程中学到了一件事,那么我希望平淡无奇的数组是可怕的,当你被允许最终使用它们时,你会欣赏标准容器。 – user2079303 2014-11-05 13:23:28

+0

啊,是的,谢谢,我没有发现这个问题,现在我明白了。 – Hadron 2014-11-05 14:14:23

回答

0

而不是void addObjects(Object * o);使用void addObjects(Object o [],int noOfArrayElements)noOfArrayElements是必需的,因为您需要可以在addObject中处理的数组元素的数量。

你的场景结构只能存储3个对象。所以你应该确保从外面你只能得到3个物体,而不是更多。在你的评论中你传递了13个对象?或者,如果你想使它通用的尝试使用malloc。

您的场景对象不会将arr_num初始化为0。希望你在某处做什么?

+0

1.对不起,也许它措辞不好,但我的意思是我需要一个Object **指针**数组。 “对象”数组是包含这些指针的数组。传递的“椭圆体”数组大小恰好为13,但它可能更大。 2.是的,arr_num在Scene的构造函数中初始化。 – Hadron 2014-11-05 13:00:52

1

问题是你正在传递派生类数组到基类指针。这不是继承。参见:

http://www.parashift.com/c++-faq/array-derived-vs-base.html

需要看完整的代码,但这个问题会得到解决:

Object ellipsoids[13];

+0

谢谢,现在我终于明白了为什么它不起作用。尽管这对我来说并不是解决方案(出于以下几个原因),但我必须创建单独的函数来将Ellipsoids,Paraboloids等添加到数组中。无论如何,感谢您的帮助。 – Hadron 2014-11-05 14:13:43