30/09/2018, 18:14

Ensure that there is no memory leak :D

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ớ.

... viết 20:16 ngày 30/09/2018

Có thể dùng các kiểu smart pointer như auto_ptr, unique_ptr, shared_ptr để làm việc.

en.wikipedia.org

Smart pointer

In computer science, a smart pointer is an abstract data type that simulates a pointer while providing added features, such as automatic memory management or bounds checking. Such features are intended to reduce bugs caused by the misuse of pointers, while retaining efficiency. Smart pointers typically keep track of the memory they point to, and may also be used to manage other resources, such as network connections and file handles. Smart pointers were first popularized in the programming langua...

Mai Anh Dũng viết 20:29 ngày 30/09/2018

IDE tự generate code hả Vũ?

... viết 20:26 ngày 30/09/2018

nghĩa là sao anh Đạt

Mai Anh Dũng viết 20:17 ngày 30/09/2018

Em bảo IDE có cơ chế hủy pointers. Làm thế nào nó hủy được?

... viết 20:29 ngày 30/09/2018

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

Mai Anh Dũng viết 20:16 ngày 30/09/2018

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é)

... viết 20:17 ngày 30/09/2018

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.

Mai Anh Dũng viết 20:28 ngày 30/09/2018

Làm cách nào để chắc chắn trong chương trình của mình không có memory leak

  • 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

  • http://cppcheck.sourceforge.net/
  • http://vld.codeplex.com/
lahata viết 20:24 ngày 30/09/2018

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);  
	
}
viết 20:20 ngày 30/09/2018

;)) 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/)

Bài liên quan
0