如何在此功能中分配内存?

时间:2010-12-04 20:23:36

标签: c++ memory-management dynamic-memory-allocation

我有以下函数和类的层次结构,因此多数是由Pairs,Rational和Complex继承的。所有这些共享函数在Multinumber中是虚拟的。我的问题是以下代码。现在它的编写方式,newElement变量在添加到类型为setArray的{​​{1}}时超出范围,我需要找出在此函数中分配内存的方法。奇怪的是,传入函数的参数,即使打印在第一行,在我执行Multinumber**时总是空的。有人可以告诉我这里有什么问题吗?

cout<<newElement->tostring();

编辑:是的,海报是正确的,这是一项家庭作业

3 个答案:

答案 0 :(得分:1)

为避免内存问题,请将Multinumber** setArray替换为std::vector<boost::shared_ptr<Multinumber>> setArray

答案 1 :(得分:0)

如果您需要增长,请将其设为vector<Multinumber*>类型并使用setArray.push_back(newElement)。

只要向量处于活动状态,您就需要确保调用者使元素保持活动状态。如果没有,可能会向Multinumber添加一个虚拟Clone方法,返回一个副本(子类实现它)。然后,push_back(newElement->Clone())

答案 2 :(得分:0)

在现实世界中(我从your previous question了解到这是作业),你不会实现自己的集合。标准库提供此功能(std::set如果要保持元素顺序; std::unordered_set如果您正在使用C ++ 0x和/或具有适当的扩展,并优先考虑速度超过附加功能)。

您可能还应该研究一些智能指针类。

那说:

在您的代码中,newElement不会超出范围。发生的事情是你已经获得了一个指向调用代码数据的指针,然后调用代码让指向的东西超出了范围。

As I responded对于上一个问题,您需要使用“virtual clone成语”来制作副本。

基本上,你想要以传入的,指向的东西的类型调用new,以这种方式制作副本。为确保“制作副本”,自然要做的就是使用new复制构造函数,即new whatever(my_existing_whatever_instance)。但是在C ++中,构造函数不能是virtual,因此我们实际上无法将所需的类型放入new调用中。相反,我们必须使用成员函数伪造它。由于成员函数可以virtual,因此会在实际指向的内容中查找正确的版本clone,该内容实现为使用自己的new调用{{1}}键入,并调用自己的复制构造函数。该链接提供了详细信息。