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?
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?
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ướcsizeof(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ỷ
À 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.
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);
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