簡體   English   中英

Memory 泄漏到 C++ (Valgrind)

[英]Memory leak in C++ (Valgrind)

我用最少的方法實現了堆棧。 在這個程序中,我從 valgrind 得到一個錯誤。 push() 和 main() 函數有問題。 當我添加刪除 st; 到 push() function,我得到更多的錯誤。 我通過 valgrind./a.out 檢查它。 抱歉,代碼很長。 我還寫了 rest 的堆棧函數。 但是它們沒有錯誤,我把那些留在了可能有錯誤的代碼中。

#include <cstring>
#include <iostream>

struct Stack {
  int data;
  int min;
  Stack* next;
};

void Push(Stack** top, int n) {
  Stack* st = new Stack();
  st->data = n;
  if (*top == NULL) {
    *top = st;
    (**top).min = n;
  } else {
    st->min = ((n <= (**top).min) ? n : (**top).min);
    st->next = *top;
    *top = st;
  }
  std::cout << "ok" << std::endl;
}

void Pop(Stack** top) {
  if (*top != NULL) {
    std::cout << (**top).data << std::endl;
    *top = (*top)->next;
  } else {
    std::cout << "error" << std::endl;
  }
}

int main() {
  Stack* top = nullptr;
  int m;
  std::cin >> m;
  std::string str;
  for (int i = 0; i < m; ++i) {
    std::cin >> str;
    if (str == "push") {
      int value;
      std::cin >> value;
      Push(&top, value);
    }
    if (str == "pop") {
      Pop(&top);
    }
  }
  delete top;
}

當您delete top時,您會破壞它(在您的情況下它什么都沒有,但如果有興趣,您可以分散注意力閱讀有關析構函數的信息)並釋放分配給top的動態 memory 。 但是,您實際上還想delete top->nexttop->next->next (如果存在)等。修補程序:

while (top) { // same as "while (top != nullptr) {"
    Stack* next = top->next; // we can't use `top` after we `delete` it, save `next` beforehand
    delete top;
    top = next;
}

現在,關於更一般的事情。 該課程教你一些非常古老的 C++(幾乎只是普通的 C;即使這里的 C 也很糟糕)。 至少,您的整個Push()可以替換為(感謝左值引用Type& )、 std::min聚合初始化):

void push(Stack*& top, int n) {
    top = new Stack{n, std::min(n, top ? top->min : n), top};
    std::cout << "ok\n";
}

我是 C++ 編程的新手。 我曾經寫過Python

做得好。 可悲的是,這樣的教學表明 C++ 太古老和可怕了。

編輯

這是 Push 中的一個新內容,因此 Pop 中應該很可能有一個刪除

沒錯(感謝@molbdnilo)。 您應該delete pop的 ped 元素,而不是僅僅泄漏它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM