Trong việc lập trình C++ thì việc quản lý bộ nhớ rất đâu đầu và thường không tránh khỏi memory leak xảy ra. Câu hỏi của mình: Làm cách nào để chắc chắn trong chương trình của mình không có memory leak Hy vọng các câu trả lời sẽ là kinh nghiệm chung cho mọi người khi làm việc với bộ nhớ.
Ensure that there is no memory leak
Có thể dùng các kiểu smart pointer như auto_ptr, unique_ptr, shared_ptr để làm việc.
IDE tự generate code hả Vũ?
nghĩa là sao anh Đạt
Em bảo IDE có cơ chế hủy pointers. Làm thế nào nó hủy được?
Em ít khi thấy người dùng Qt Creator delete Object một cách thủ công, nên em nghĩ vậy
hahaha vậy là em đoán sai rồi, em google Qt QObject delete later rồi đọc lại nhé.
QObject là class tự hủy sự dụng cơ chế RAII (bỏ Qt hai năm rồi, em kiểm trai lại giúp anh nhé)
void QObject::deleteLater() Schedules this object for deletion.The object will be deleted when control returns to the event loop. If the event loop is not running when this function is called (e.g.deleteLater() is called on an object before QCoreApplication::exec()), the object will be deleted once the event loop is started.
À đúng rồi, vẫn phải kết nối signals nào đó với slot có method deleteLater() để nó hủy Object
Thua anh Đạt quả này
P/s: Trong cocos2d-x thì nó có CC_SAFE_DELETE(); để hủy đối tượng an toàn.
- Luôn ghi nhớ cấp phát thỉ phải hủy
- Sử dụng smart pointers
Dùng thêm chương trình để kiểm tra leak
Chú ý đến việc cấp phát và hủy rất quan trọng nhưng việc này chỉ có ý nghĩa khi hiểu được những kiến thức cơ bản. Để có được thứ cơ bản thì trao đổi với nhau là cách hiệu quả nhất
Một lỗi liên quan đến bộ nhớ mà mình không nghĩ là sẽ mắc phải khi làm bài tập.
class MyArr{
int *ptrData;
int size;
public:
MyArr(int *_ptrData, int _size) :size(_size){ // Hàm tạo 1
ptrData = new int[_size];
ptrData = _ptrData;
}
MyArr(int _size, int *_ptrData) :size(_size){ // Hàm tạo 2
ptrData = new int[_size];
if (ptrData != nullptr){
memcpy(ptrData, _ptrData, _size * sizeof(int));
}
}
~MyArr(){
delete[]ptrData; // Hàm hủy sẽ diễn ra như thế nào, nó sẽ hủy cái gì?
}
};
void main(){
const int size = 5;
int ptrData[size] = { 1, 2, 3, 4, 5 };
MyArr objArr1(ptrData,size);
MyArr objArr2(size, ptrData);
}
;)) có cấp phát thì có hủy. Phần mềm hỗ trợ thì cũng chỉ một phần thôi, ngày trước tớ có dùng vld nhưng hồi đó tìm hiểu thấy linux có công cụ rất hay, chưa từng được xài qua :D. (vừa search lại google đây http://valgrind.org/)