C ++指针,对象等

时间:2010-04-17 00:08:49

标签: c++ pointers object containers

可能有点令人困惑,但是......

假设我在类中有一个向量类型成员,类似于vector<Operator*>(我的类上有方法可以从这个容器中返回操作符)。 现在让我说我的类上有一个方法接收一个Operator对象op并将其插入到向量中。我想知道的是:将它直接插入向量(push_back(&op))会有什么问题吗?或者我应该使用复制构造函数来创建一个新的运算符,然后将这个新的运算符放在向量上(使用push_back(new Operator(op)))?

(操作员是我创建的课程)

2 个答案:

答案 0 :(得分:2)

使用&amp; op只能为您提供指向对象(仍在堆栈中)的指针,而不是副本。因此,当对象超出范围(并被清理)时,向量中的指针将变为无效并将导致问题。

您最好的选择是使用上面建议的复制构造函数。

答案 1 :(得分:1)

好的,让我看看我是否遵循你想要做的事情。 您已经创建了一个名为运算符的课程。 你有一个vector <Operator *>,你想知道这是否会有问题。

简短回答是肯定的,可能会有。它是关于向量的范围的,因为当它超出范围时,在向量上为所有那些在向量中有指针的Operator对象分配的内存将不会被向量清理。在像c ++这样的非托管语言中,除非你使用专门为你处理事情的类,否则你必须敏锐地意识到范围和潜在的内存泄漏。

您需要问自己的两个问题是“谁拥有运营商对象?”和“谁负责清理堆上分配的运算符对象,并由向量中的指针指向?”

当为拥有向量的对象调用析构函数时,您可以自己清理该内存。

我想你可能想看看类似的this SO question。还有其他解决方案 - 例如,使用boost类可能更好。