我有一个针对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/