2010-02-04 39 views
5

Tôi đến từ nền C khá mạnh và có nền tảng khá vững chắc trong C++. Gần đây tôi đã làm việc với C# và các ngôn ngữ cấp cao hơn. Một dự án mà tôi đang xem xét để làm việc có thể thực sự được hưởng lợi từ việc sử dụng QT4, nhưng tôi có một số câu hỏi về quản lý bộ nhớ dường như tôi không hiểu. Tôi đã đọc tài liệu QT4 và nó đã không giúp tôi nhiều. Vì vậy, đó là lý do tại sao tôi ở đây.Quản lý bộ nhớ QT4

1) Được rồi vì vậy để bắt đầu, tôi hiểu rằng cách dễ nhất để sử dụng đối tượng Qt4 là để khai báo địa phương:

void MyFunc() 
{ 
    QString foo; 
    // do stuff to foo 

} 

này đơn giản là đủ, tôi có thể đưa đối tượng đó, và vượt qua nó xung quanh và biết rằng khi nó đi ra khỏi phạm vi nó sẽ bị phá hủy. Nhưng đây là câu hỏi của tôi.

1) Nếu tôi tạo một QList và thêm các đối tượng vào nó, và sau đó QList nằm ngoài phạm vi, nó sẽ cố gắng xử lý các đối tượng con không?

2) Nếu thường trình QT4 trả về một con trỏ tới một đối tượng, thì tôi có chịu trách nhiệm cho việc phân bổ đối tượng đó không?

3) Nếu tôi tạo một phân lớp của một QWidget và thêm nó vào một QWindow, làm thế nào để đảm bảo rằng khi QWindow bị phá hủy, nó có phụ tùng của tôi với nó?

Cảm ơn sự giúp đỡ.

+0

Một số câu trả lời của bạn nằm trong tài liệu Quyền sở hữu đối tượng: http://cep.xor.aps.anl.gov/software/qt4-x11-4.2.2/objecttrees.html. –

Trả lời

13

Nếu tôi tạo ra một QList và thêm các đối tượng với nó, và sau đó là QList đi ra khỏi phạm vi, nó sẽ cố gắng để deallocate các đối tượng trẻ?

QList giống như std :: list. Nó sẽ phá hủy các vật thể chứa khi nó bị phá hủy.

Nếu thói quen Qt4 trả về con trỏ cho đối tượng, tôi có chịu trách nhiệm phân bổ đối tượng đó không?

thường không, các tài liệu phải ghi rõ những gì xảy ra. Một ngoại lệ là các hàm take * (ví dụ: QTableWidget :: takeItem).

Nếu tôi tạo phân lớp của QWidget và thêm nó vào QWindow, làm cách nào để đảm bảo rằng khi QWindow bị hủy, phải mất tiện ích của tôi với nó?

Tùy thuộc vào cách bạn tạo đối tượng lớp con.

  • Bạn có thể thêm nó làm thành viên của tiện ích cửa sổ (không có QWindow) và nó sẽ bị hủy giống như bất kỳ biến thành viên nào.
  • Bạn có thể cấp phát mới và chuyển cửa sổ làm cha mẹ và nó sẽ bị xóa nhờ triển khai cây đối tượng Qt (như đã đề cập)
  • Bạn có thể tự quản lý bộ nhớ.

Khi QWidget (hoặc bất kỳ QObject) nào bị phá hủy, nó sẽ tự xóa chính nó khỏi danh sách xóa để cha mẹ tự xóa và không lo lắng về việc xóa hai lần.

1

Câu trả lời là mối quan hệ đối tượng cha mẹ/con tồn tại trong Qt. Khi một đối tượng cha mẹ nằm ngoài phạm vi, hoặc bị phá hủy bởi bất kỳ phương tiện nào khác, Qt đảm bảo rằng tất cả các đối tượng con của nó đều bị hủy.

Thông tin thêm về hành vi này có thể được tìm thấy ở đây ->http://doc.trolltech.com/4.4/objecttrees.html

2

Bạn có thể muốn bắt đầu tại đây: Object Trees vì điều này giải thích mối quan hệ cha/con Qt sử dụng (và tất cả các liên kết khác được cung cấp cho đến nay đã lỗi thời hoặc bên thứ ba).

1) Nếu tôi tạo một QList và thêm đối tượng vào nó, và sau đó QList nằm ngoài phạm vi, nó sẽ cố gắng xử lý các đối tượng con không?

Có, nó hoạt động giống như std :: list. Cũng giống như std :: list, nó sẽ chỉ deallocate không xóa. Đây là nơi một số trong số Qt pointer classes có ích

2) Nếu thói quen QT4 trả về con trỏ cho đối tượng, thì tôi có chịu trách nhiệm phân bổ đối tượng đó không?

Như rpg đã nói, thường thì không, nhưng nếu bạn là tài liệu sẽ nói như vậy.

3) Nếu tôi tạo phân lớp của QWidget và thêm nó vào QWindow, làm cách nào để đảm bảo rằng khi QWindow bị hủy, phải mất tiện ích của tôi với nó?

Khi bạn tạo lớp con của mình, hãy đảm bảo sử dụng tham số cha trong ctor. Bằng cách này, đối tượng sẽ bị xóa bởi Qt. Nếu cần, bạn có thể đặt cấp độ gốc sau QObject::setParent (QObject * parent).

Các vấn đề liên quan