C++ 堆栈使用模板化链表 - 内存泄漏

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

我正在尝试弄清楚如何从这段代码中消除所有内存泄漏。我知道这个问题可能源于 push(T value)使用 new Node<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

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

最佳答案

您需要删除堆栈中的所有元素。以下是执行此操作的几种方法:

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

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

关于C++ 堆栈使用模板化链表 - 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26436136/

相关文章:

c++ - 为什么 std::function 在签名中接受 this 引用?

c++ - 您能否为具有非类型参数的模板类型部分特化模板

C++ 使用运算符重载构建双面树 - 什么是好的内存解决方案?

windows - 告诉故事内存碎片的迹象(而不是内存泄漏)?

ios - 在捕获列表中使用 unowned 导致崩溃,即使 block 本身没有执行

c++ - 特化模板覆盖函数/避免对象切片

c++ - 查找未使用的对象(非原始值)

c++ - 如何为 std::array 中的 std::vectors 保留内存?

objective-c - 为什么我的对象在无数次发布后仍然有效?

c++ - SDL2 C++ - SDL_FreeSurface 不会从 RAM 中删除图像