【问题标题】:C++ Pointers, objects, etcC++ 指针、对象等
【发布时间】:2011-02-09 01:06:18
【问题描述】:

这可能有点混乱,但是...

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

(运算符是我创建的一个类)

【问题讨论】:

  • 你在说什么运营商...你能澄清一下
  • 有点混乱?它至少是一个字节混乱。
  • 你的问题毫无意义。添加代码示例。
  • 已编辑。抱歉,它之前也“吃掉”了我的 。
  • 这就是为什么您应该使用代码格式来发布代码。这是 100101 小按钮。

标签: c++ pointers object containers


【解决方案1】:

使用 &op 只会给你一个指向对象的指针(它仍然在堆栈上)而不是一个副本。因此,当对象超出范围(并被清理)时,向量中的指针变得无效并会导致问题。

最好的办法是使用上面建议的复制构造函数。

【讨论】:

  • Lodle 说的:如果你只是推送地址,并不能保证你以后去引用它时它会在那里。如果你用“new”创建了你的对象,它会一直存在,直到你“删除”它;如果您已自动创建它(即使用自动声明),它可能不会持续存在。如果它是全局定义的,你可能会没事(即,你不必复制它)。
【解决方案2】:

好的,让我看看我是否按照您要执行的操作。 您已经创建了一个名为 Operator 的类。 你有一个vector <Operator *>,你想知道这是否会有问题。

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

您需要问自己两个问题:“谁拥有 Operator 对象?”和“谁负责清理在堆上分配并由向量中的指针指向的 Operator 对象?”

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

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

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2020-07-07
    • 2014-03-18
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多