簡體   English   中英

在這種情況下是否需要刪除內存?

[英]Do I have to delete memory in this case?

這是一個使用動態內存的簡單程序。

我的問題是我是否必須刪除和上的內存,否則該結構將為我處理它?

#include <iostream>
struct Student {
  int grade;
  char *name;
};

void print(Student name);
int main() {
  Student one;
  one.grade = 34;
  one.name = new char[12];
  int i;
  for (i = 0; i < 11; ++i) {
    one.name[i] = 'a' + i;
  }
  one.name[i] = '\0';
  print(one);

  delete[] one.name;
  return 0;
}
void print(Student name) {
  std::cout << name.name << " has a score of " << name.grade << "\n";
}

有一條簡單的經驗法則:每次調用new您都應該刪除一次。 在這種情況下,您應該像這樣刪除one.name:delete delete [] one.name

當然,在不再需要它的價值之后,您應該這樣做。 在這種情況下,這正好在返回之前。

使用deletefree完成使用newmalloc dynamically分配的malloc必須釋放它,否則會出現Memory leak

  • 區分deletedelete[] :第一個不帶下標的運算符用於刪除為new分配的指針動態內存。 后者用於刪除動態分配的數組。

  • 因此,在您的情況下:

     one.name = new char[12]; // an array of 12 elements in the heap delete[] one.name; // freeing up memory char* c = new char('C'); // a single char in the heap delete c; 
  • 不要混用new, delete使用malloc, free new, delete malloc, free

這是未定義的行為,因為無法可靠地證明指針后面的內存已正確分配(即,對於delete來說是new,對於delete []是new [])。 確保這樣的事情不會發生是您的工作。 使用正確的工具(即智能指針)很簡單。 每當您說刪除時,您就做錯了。

如果您不想使用唯一/共享的指針,則可以使用構造函數進行分配,並使用析構函數自動釋放內存。

如果結構中的原始指針是觀察指針,則不必刪除內存(當然,代碼中某處的人必須釋放內存)。

但是,如果原始指針是所有者指針,則必須釋放它。

通常,對new[]每次調用都必須具有對delete[]匹配調用,否則會浪費內存。

在您的代碼中,您調用了new[] ,因此必須調用delete[]才能正確釋放內存。

在C ++中,您可以避免容易出錯的易於泄漏的原始指針,而改用智能指針或容器類(例如std::vectorstd::string等)。

創建結構並不意味着它將在C ++中處理垃圾回收,因此沒有垃圾回收,因此對於使用new分配的每個內存,都應使用delete關鍵字釋放空間。 如果您用JAVA編寫代碼,則不必刪除,因為垃圾收集器會自動刪除未使用的引用。

實際上,該結構不會釋放或刪除您已創建的內存。 如果要釋放空間,可以執行以下操作。

#include <iostream>
using namespace std;
int main()
{
    char *c = new char[12];
    delete[] c;
    return(0);
}

暫無
暫無

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

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