【问题标题】:C++ Stack Using Templated Linked List - Memory Leaks使用模板链表的 C++ 堆栈 - 内存泄漏
【发布时间】:2014-12-13 16:38:21
【问题描述】:

我试图弄清楚如何从这段代码中删除所有内存泄漏。我知道这个问题可能源于使用new Node<T>(value) 时的push(T value) 函数,但我不知道如何解决这个问题。

#ifndef MYSTACK_H
#define MYSTACK_H 

#include <stdexcept>

using namespace std;



template <class T> class MyStack{

template <class G> class Node{
  public:
  G value;
  Node* next;
  Node(T val, Node* n = NULL): value(val), next(n){};
};

public:
  MyStack(){
    head = NULL; 
    tail = NULL;
    my_size = 0;
  };

  ~MyStack(){
    delete head;
  }

  void push(T value){
    if(head == NULL){
      head = new Node<T>(value);
      tail = head;
      my_size++;
    }
    else{
      Node<T> *temp = new Node<T>(value);
      temp->next = head;
      head = temp;
      my_size++;      
    }
  }

// . . . (removed - brevity)

private:
  unsigned int my_size;
  Node<T> *head;
  Node<T> *tail;

};

#endif

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 您希望如何删除堆栈中除head 之外的元素?
  • 仅供参考,Node 本身不需要是模板;它已经可以访问T 类型,因为它是MyStack 下的嵌套类型。也就是说,MyStack&lt;int&gt;::NodeMyStack&lt;float&gt;::Node 已经是不同的类型。将Node 设为模板是多余的——除非您需要GT 不同,这里似乎并非如此。
  • @SleuthEye 显然带有析构函数,但我不知道如何实现。
  • @cdhowie 哦,哇,你说得对。我什至没有意识到这一点。谢谢!

标签: c++ memory-management memory-leaks linked-list stack


【解决方案1】:

您需要删除堆栈中的所有元素。这里有几种方法可以做到这一点:

  1. 在您的析构函数中,循环遍历堆栈中的所有元素并删除它们。
  2. 在您的析构函数中,重复调用pop 直到堆栈为空。

假设您已经有一个pop 函数,选项 2 的代码可能更简单,但效率可能较低,因为它会做额外的工作来确保堆栈结构在被销毁时得到维护。

【讨论】:

  • 现在看起来很明显。我确实有一个弹出功能,所以我可能会选择选项 2,因为我现在更担心功能。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
相关资源
最近更新 更多