Mảng mà bạn gọi delete this->m_array; thì nguy hiểm lắm, hên là trong ví dụ kiểu int là kiểu cơ sở thôi, còn nếu nó là kiểu do người dùng tự định nghĩa thì có thể xảy ra memory leak. Với lại không nên gọi delete trong destructor.

Thân.

Mục đích của mình ở bài viết này là đề cập đến Virtual Destructor (vì sao phải có Virtual Destructor, và Virual Destructor hoạt động ra sao), tuy nhiên rất cảm ơn bạn đã phát hiện ra lỗi mình mắc phải ở trên. Còn vấn đề tại sao mình không nên delete trong Destructor thì bạn có thể giải thích rõ hơn được không để mọi người cùng hiểu. Cảm ơn bạn!

Các a cho e hỏi tại sao delete một mảng dữ liệu tự định nghĩa lại nguy hiểm vậy ạ? Mới tiếp cận vẫn chưa hiểu hết ý nghĩa của các cao thủ :( mong mọi người giúp đỡ .E xin cảm ơn !

Chào bạn,

Đối với các kiểu dữ liệu người dùng tự định nghĩa, hệ thống sẽ không xác định được trong đó có những gì, được cấp phát động hay tĩnh, kích thước và số lượng bao nhiêu, ... Từ khoá delete không có khả năng "quản lý" những vùng nhớ cấp phát bởi các con trỏ bên trong lớp, do đó không thể giải phóng được những vùng nhớ này.

Phương pháp ở đây là tự định nghĩa một hàm Release (hoặc tương tự), giải phóng các vùng nhớ cần thiết một cách thủ công.

E cảm ơn các a!.E đã hiểu ý của mọi người rồi ạ.Bài viết rất hay đã cung cấp một kiến thức rất bổ ích cách giải thích của các a cũng rất dễ hiểu và nhanh chóng.Mong rằng stdio sẽ có nhiều bài viết hay để chia sẻ nhiều kiến thức cho mọi người.

Comment của anh không hiểu sao bị mất, nhưng Rye trả lời vậy rõ ràng rồi, cám ơn Rye.

Chào anh La Kiến Vinh, anh Rye Nguyen, Gordon FreeMan, và các anh chị khác, em có thấy anh Rye Nguyen chia sẻ bên dưới nhưng em có thắc mắc sau: với một kiểu người dùng tự định nghĩa , ví dụ có con trỏ, nếu người dùng có viết hàm hủy cho nó, thì em nghĩ là đâu có mất mát bộ nhớ gì đâu ạ, em lấy ví dụ luôn.

Em định nghĩa một class tên là Demo có hai thuộc tính là int * pointer và double var (size của class này là 16 byte), class này em có định nghĩa hàm khởi tạo và hàm hủy, trong hàm main em dùng câu lệnh Demo * A = new Demo; lúc này bộ nhớ cấp phát cho em 16 byte trên heap để chứa đối tượng này, sau đó em dùng delete A thì hàm hủy của đối tượng này được gọi, giải phóng hết tất cả vùng nhớ được cấp phát trong quá trình hoạt động, rồi sau đó câu lệnh delete xóa 16 byte (đã cấp phát cho đối tượng này), em thấy quá trình trên đâu để mất mát vùng nhớ nào đâu ạ. Mong các anh chỉ giúp em ạ.

Vấn đề em nói về mặt kỹ thuật là đúng, tuy nhiên các cao thủ ở trên đang bàn về case study và best practice, là các vấn đề về kinh nghiệm và sơ suất của con người, không phải là kỹ thuật lập trình.

Vâng em cảm ơn anh!