【问题标题】:C++ Destructors using pop_back使用 pop_back 的 C++ 析构函数
【发布时间】:2014-06-10 19:07:16
【问题描述】:

我目前正在自学 C++,但在创建析构函数时遇到了一些麻烦。

这是我正在努力解决的主要部分的代码

#include <list>

using namespace std;

class Test
{
    private: 
        list<char> *tempList;
    public:
        Test()
        {
            tempList->push_back('a');
            tempList->push_back('b');
            tempList->push_back('c');
        }

        ~Test()
        {
            while (tempList->size() != 0)
            {
                tempList->pop_back();
            }
        }
};

如您所见,我正在使用 std::list 来实现双向链表。目前我正在摆弄它,因此为什么将变量命名为 tempList 以及为什么我将 a,b,c 放在那里。

我需要帮助的是创建析构函数。我已经尝试过创建自己的解决方案,但后来我开始在谷歌上搜索其他解决方案,但没有一个看起来像我的。

我希望我的析构函数做的主要事情是清理 tempList,它是一个 char 的双向链表。我认为需要发生的是我需要找出一种方法来删除链表中的每个元素。

【问题讨论】:

  • 那是你的实际代码吗?您永远不会分配 tempList 指针。
  • 您的析构函数似乎没有明显问题,但同意tempList = new list&lt;char&gt;; 可能会帮助您的构造函数。
  • @RetiredNinja 这是我目前仍在学习的代码。正确的实现方式是什么?
  • 为什么要以指针开头?为什么不只是std::list&lt;char&gt; tempList;? (尽管对于charstd::vector&lt;char&gt; 几乎肯定是一个更好的选择,除非您需要能够插入和删除任意元素而不会使其他元素的迭代器失效。)

标签: c++ class linked-list destructor


【解决方案1】:

假设 tempList 已正确分配和解除分配(现在不是),您无需调用任何内容 - 列表中的元素将自动销毁。

最简单和最干净的解决方案是根本没有指针:

class Test
{
    private: 
        list<char> tempList;
    public:
        Test()
        {
            tempList.push_back('a');
            tempList.push_back('b');
            tempList.push_back('c');
        }
};

【讨论】:

    【解决方案2】:

    标准类std::list 有自己的析构函数。当调用 Test 类的析构函数时,它又调用 std::list 的析构函数。无需使用 pop_back 从列表中删除元素。这是析构函数中的多余操作。 std::list 构造函数分配的内存将连同放置在那里的字符一起被删除。

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 2022-08-19
      • 1970-01-01
      • 2011-05-12
      • 2011-04-08
      • 2012-05-08
      • 1970-01-01
      • 2012-07-28
      • 2014-05-03
      相关资源
      最近更新 更多