【问题标题】:Question regarding C++ Lists关于 C++ 列表的问题
【发布时间】:2010-05-07 05:55:06
【问题描述】:

列出狗; ...... …………

所以我添加了许多狗对象。 如果我打电话给dog.pop_front();

内存会自动释放吗?对于我弹出的对象?

如果我打电话

list<Dog*> dog2;
dog2.push_back(dog.front());

然后我会打电话给dog.pop_front() 这样可以吗?我将假设 Dog 作为类型结构。

【问题讨论】:

    标签: c++


    【解决方案1】:

    Dog 对象的内存不会被删除;这个你必须自己做。

    但是,Dog* 类型的指针的内存,以及围绕它的任何“列表节点”对象,list 类自动删除。 p>

    【讨论】:

    • 所以如果我调用 list dog2; dog2.push_back(dog.front());然后我会打电话给 dog.pop_front() 所以这行得通吗?我将假设 Dog 为类型结构。
    • @mousey 如果两个容器的类型相同,是的。
    【解决方案2】:

    我建议list&lt;shared_ptr&lt;Dog&gt; &gt; 负责删除狗。

    【讨论】:

      【解决方案3】:

      你一直在问这个序列:

      list<Dog*> dog2;
      dog2.push_back(dog.front());  // time 1
      dog.pop_front();              // time 2
      

      在时间 1,dog2dog 都有一个指向同一个对象的指针。

      在时间 2,指向该对象的指针从 dog 中删除,并且仅在 dog2 中。

      假设您最初使用new Dog 创建了该对象,则在您通过调用delete ptr 明确释放它之前,该对象不会被释放

      【讨论】:

        【解决方案4】:

        没有。你仍然需要释放它。

        【讨论】:

          【解决方案5】:

          不,您必须自己通过调用 delete 或 free 来解除分配,具体取决于您的分配方式。

          【讨论】:

            【解决方案6】:

            没有。 Dog 对象的内存不会被释放。您必须使用 delete 运算符来释放它。

            【讨论】:

              【解决方案7】:

              当您将Dog* 插入到列表中时,会创建一个指针 的副本并将其插入到列表中。当你从列表中弹出时,分配给这个指针的内存被释放。为 Dog 对象分配的内存没有被释放,因为它不是由列表分配的。你必须自己释放它。

              【讨论】:

              • 我没有得到你 Naveen 所以如果我调用 list dog2; dog2.push_back(dog.front());然后我会打电话给 dog.pop_front() 这样可以吗?
              • @mousey:可以。这里要注意的重要一点是指针的 copy 被插入到列表中。当您弹出此副本时,此副本将被删除。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-31
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多