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.