30/09/2018, 19:57

Khi mình dùng con trỏ trong hàm thì cuối hàm có cần delete không hay là ra khỏi hàm nó tự del?

Cho em hỏi là khi mình dùng con trỏ trong hàm thì cuối hàm có cần delete không hay là ra khỏi hàm nó tự del ? Ví dụ như hàm này chẳng hạn, em có cần del 2 con trỏ pfind và pfindbef không?

Interns viết 22:14 ngày 30/09/2018

Không nhé!

Ví dụ:

Node *p = new Node; //có new
...
delete p;          //thì phải có delete
  • Node *p là khai báo biến con trỏ trỏ tới kiểu dữ liệu Node

  • new Node là kêu máy tính cấp phát 1 vùng nhớ mới có kích thước sizeof(Node)

  • Node *p = new Node; là cho biến p trỏ tới vùng nhớ đã cấp phát trên

Quay lại trường hợp của bạn:

Node_sv *pfind = Lsv.pHead; //khai báo và khởi tạo 1 biến con trỏ pfind trỏ tới vùng nhớ mà Lsv.pHead đang trỏ tới, vùng nhớ có sẵn chỉ việc trỏ tới đó, đâu có tạo mới đâu mà cần huỷ
Node_sv *pfindbef = pfind;  //khai báo và khởi tạo 1 biến con trỏ pfindbef trỏ tới vùng nhớ mà pfindbef đang trỏ tới, vùng nhớ có sẵn chỉ việc trỏ tới đó, đâu có tạo mới đâu mà cần huỷ
captain america viết 22:01 ngày 30/09/2018

À cho em hỏi em làm 2 hàm này có đúng không. cái chỗ delete ấy. Hay là cho delete vào trong vỏng for luôn.

Interns viết 22:09 ngày 30/09/2018

Khi bạn hiểu bản chất của việc cấp phát bộ nhớ thì bạn sẽ biết delete ở đâu

Node_sv *p = new Node_sv; //tạo mới vùng nhớ và cho p trỏ tới đó
...
  p = CreateNodesv(sv);//ở đây bạn lại cho p trỏ tới 1 Node khác mà hàm createNodesv() đã return, vậy là bạn đã bỏ vùng nhớ mà bạn đã tạo ở trên
//bạn có thấy là bạn đã lãng phí đi vùng nhớ đó không

sửa lại là

Node_sv *p;
...
  p = CreateNodesv(sv);
Gió viết 22:06 ngày 30/09/2018

Cách hạn chế del nhầm là trước khi del xem nó có = NULL không, sau khi del gán nó = NULL

Bài liên quan
0