可能有点令人困惑,但是......
假设我在类中有一个向量类型成员,类似于vector<Operator*>
(我的类上有方法可以从这个容器中返回操作符)。
现在让我说我的类上有一个方法接收一个Operator对象op
并将其插入到向量中。我想知道的是:将它直接插入向量(push_back(&op)
)会有什么问题吗?或者我应该使用复制构造函数来创建一个新的运算符,然后将这个新的运算符放在向量上(使用push_back(new Operator(op)))?
(操作员是我创建的课程)
答案 0 :(得分:2)
使用&amp; op只能为您提供指向对象(仍在堆栈中)的指针,而不是副本。因此,当对象超出范围(并被清理)时,向量中的指针将变为无效并将导致问题。
您最好的选择是使用上面建议的复制构造函数。
答案 1 :(得分:1)
好的,让我看看我是否遵循你想要做的事情。
您已经创建了一个名为运算符的课程。
你有一个vector <Operator *>
,你想知道这是否会有问题。
简短回答是肯定的,可能会有。它是关于向量的范围的,因为当它超出范围时,在向量上为所有那些在向量中有指针的Operator对象分配的内存将不会被向量清理。在像c ++这样的非托管语言中,除非你使用专门为你处理事情的类,否则你必须敏锐地意识到范围和潜在的内存泄漏。
您需要问自己的两个问题是“谁拥有运营商对象?”和“谁负责清理堆上分配的运算符对象,并由向量中的指针指向?”
当为拥有向量的对象调用析构函数时,您可以自己清理该内存。
我想你可能想看看类似的this SO question。还有其他解决方案 - 例如,使用boost类可能更好。