我有一个针对Uni类的数据结构项目,该项目将实现具有链表的堆栈。简单的东西。我们已经在代码方面获得了一些帮助,以向我们展示实现这种结构的正确方法。

堆栈类:

class Stack
{
public:
    Stack(void)
    {
        top = NULL;     // Initialises defualt top node pointer.
    }

    ~Stack(void)
    {
        while (NodePop() != NULL){}
    }

    void Push(int value)    // Pushes a new node onto the stack.
    {
        Node* temp = new Node(value, top);  // Creates a temporary node with a value and makes it
                                            // point to the top node as the next node in the stack.

        top = temp;                         // Temporary node becomes the top node in the stack.
    }

    Node* NodePop(void)
    {
        /* Remove top node from the stack */
        Node* temp = top;                       // Creates a temporary node to return, sets it to top node.
        if (top != NULL) top = top->getNext();  // Points the stacks top node to the next node in the list.
        return temp;                            // Returns a pointer to the popped node still in the heap.
    }

    int Pop(void)       // Pops the top node off of the stack. Returns the nodes value.
    {
        Node* temp = NodePop();
        int valueReturn = 0;

        /* Sets the return value */
        if (temp != NULL)
        {
            valueReturn = temp->getVal();   // Set return value to the nodes value if there is a node left.
        }
        else
        {
            throw "Stack Empty";            // Throws exception if temp is NULL and stack is empty.
        }

        delete temp;            // Deletes the node entirely from the heap.

        return valueReturn;
    }

private:
    Node* top;

};

节点类:
class Node
{
public:
    Node(int value, Node* nextptr = NULL, Node* prevptr = NULL, int currentpriority = 0)
    {
        /* Set initial variables for the node at creation */
        this->value = value;
        this->next = nextptr;
        this->prev = prevptr;
        this->priority = currentpriority;
    }

    // bunch of getters and setters...

private:
    Node* next;     // Pointer to the next node.
    Node* prev;     // Pointer to the previous node.
    int priority;   // Stores the node priority as a number 0-9.
    int value;      // Stores the node value for printing.

};

我们不能更改任何类的结构(很烦人,NodePop()应该是私有(private)的,但是有)。

因此,这里的NodePop()本质上从列表中删除了顶部节点,但并未删除它;它从链接列表中删除了对它的所有引用,但从未将其从堆中删除,它只是从Pop()中的堆中删除了。一切都很好(除了能够公开调用NodePop(),但同样,我不允许将其设为私有(private))。但是,当我调用析构函数时,必须使用NodePop()而不是Pop()。

那么这是否意味着当NodePop()从析构函数运行时,永远不会从堆中删除节点?

如果是这样,我将如何删除它们,因为如果要在一段时间,do-while或if语句条件下运行它,那么它将运行nodePop(),因此始终会有一个未删除的节点?

最佳答案

实际上,不会删除节点,并且此代码将泄漏。您可以使用Valgrind之类的工具进行验证。

我将while更改为while (Node *N = NodePop()) delete N;
仅供引用,此代码绝对不是惯用的C++ 11。基本上,它的C语言编写得很差,我希望可以在其中找到更多错误。您的老师应该为演示这样的C++ 11付出一记耳光:-)

关于c++ - 调用解构函数时,这是否会导致内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33641661/

10-11 16:07