Dữ liệu tồn tại sau khi gọi delete

Mình có 1 method như sau:

class CatManager()
{
   private:
      Cat* head;
   public:
      void do_Something()
      {
         Cat** pCat = (Cat**)calloc(5, sizeof(Cat*));
         for(int i = 0; I < 5; i++)
         {
             pCat[i] = new Dog();
         }
         this->head = pCat[0];
         delete pCat;
      }
}

Mình đang làm test driven development, test người ta viết cho rồi nên cứ code để pass test thôi.

Lúc đầu mình thêm vào 1 biến temp trong class CatManager. Biến này sẽ được dùng để allocate calloc rồi sẽ được delete trong destructor của CatManager. Nhưng khi đọc lại yêu cầu thì họ bảo class có sao để vậy không được thêm biến lung tung. Bí quá không biết làm gì khi bị memory leak nên mình thêm đại delete pCat như trong cái method trên. Nó pass hết mấy cái test kiểm tra xem 5 mèo có đươc tạo ra giống vậy không nhưng mình không hiểu tại sao như vậy.

Theo mình hiểu thì khi gọi delete sau calloc thì nó sẽ giải phóng vùng nhớ mình xin cấp phát lúc trước. Nói cách khác dữ liệu trong mấy vùng nhớ đó có thể bị xóa/ghi đè lên nếu có yêu cầu từ chương trình. Khi mình chạy chương trình thì test pass nghĩa là dữ liệu nó vẫn nằm đó chứ không mất đi. Test qua là do may mắn chứ không phải vì code đúng.

Các bạn có thể giải thích cho mình tại sao vậy? Mình nên sửa code lại như thế nào chứ cái này là mình hack cho qua test chứ không đúng.

1 Like

alloc của C ko thể giải phóng bằng delete của C++ đc nhé
code C++ thì dùng toàn bộ new đi bạn

Cat** cat[5];
for ...
    cat[i] = new Cat;

rồi xoá:

delete[] cat;
4 Likes

Không được dùng array bạn ơi. Mình xin lỗi đã ko nói rõ. Mấy con mèo sẽ đc nối với nhau như 1 cái linked list.

Mình học networking nên đang viết serialize và deserialize để chuyển dữ liệu qua lại. Cái trên là viết 1 phần của hàm deserialize mình viết đơn giản lại để dễ hỏi.

Thực ra bạn xin một lần 5 slot Cat*, mỗi slot bạn xin 1 Dog. Bạn free 5 slot con trỏ thì vẫn còn đó 5 Dog chưa free.

3 Likes

Sau khi delete thì cho nó trỏ tới nullptr, trước khi sử dụng thì check nó với nullptr.

1 Like

đề yêu cầu là cái gì sao lại đi tạo mảng 5 con trỏ kia rồi lại gán head là con trỏ đầu tiên :V Nếu mảng đa hình thì phải là Cat** chứ sao chỉ có Cat* ko nhỉ :V

4 Likes

Đây là UML được vẽ trong Visual Studio


Medusa có 1 cái head pointer chỉ tới con rắn đầu tiên. Medusa là tập hợp của các con rắn, có thể gọi là manager. Mỗi con rắn lại giữ 1 quả trứng. Khi Serialize thì phải serialize medusa và tất cả con rắn trong đó. Khi serialize rắn thì phải serialize luôn trứng. Deserialize thì làm ngược lại.

Trong cái deserialize mình phải nối mấy con rắn lại sao cho giống dữ liệu được truyền vào serialize.

PS: các project của mình đều có 1 cái memory leak tracker được update liên tục từng năm bởi người viết (thầy mình). Mình không nghĩ trình độ mình đủ giỏi để lừa nó, đặc biệt là chỉ với 1 lệnh như vầy

delete pCat;

Nên mình hoàn toàn tin tưởng vào cái memory leak tracker đó

Minor suggestion: cậu nên trả lời câu hỏi của @tntxtnt, đó là cơ hội để cậu học được thêm đó :smiley:

Minor suggestion: Tớ rất tiếc khi nói ra điều này, UML cậu đưa ra trên đây hoàn toàn off topic và không thêm bất cứ thông tin có giá trị nào liên quan tới câu hỏi của cậu. Có lẽ cậu nên đưa thêm thông tin nào đó có giá trị hơn, ví dụ như trả lời 1 số câu hỏi sau:

  1. Bọn tớ không biết test của cậu như thế nào, vậy nên cậu có thể đưa cho bọn tớ bằng chứng nào đó cho việc dữ liệu vẫn còn đó không? Có thể bằng cách đơn giản in ra nội dung pCat sau khi delete.
    Mặt khác, Ichiro đã chỉ ra cho cậu rằng alloc của C không thể free được bằng delete của Cpp, cậu nên nghiêm túc cân nhắc lời khuyên đó.
  2. Làm sao cậu biết khi thêm delete vào, không còn memory leak nữa? Vì nó contradict với fact mà cậu đưa ra “dữ liệu vẫn còn đó”.
  3. (Cái này có thể liên quan tới câu hỏi trước, dù tớ không biết phần P/S của cậu có đúng là bằng chứng cậu chứng minh được không có memory leak sau khi thêm delete) Bằng cách nào cậu chắc memory leak tracker library mà thầy cậu viết check được memory leak đã hết?
    Bọn tớ không làm việc dựa trên assumption của cậu “mình hoàn toàn tin tưởng vào cái memory leak tracker đó”, nếu (1) đúng, thì (3) sẽ sai.

Bọn tớ mong nhận được câu trả lời của cậu trước khi thảo luận tiếp.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?