2010-08-05 27 views
5

Đến từ thế giới Symbian, tôi đã quen với việc sử dụng heap càng nhiều càng tốt để tránh hết dung lượng ngăn xếp, đặc biệt khi xử lý các bộ mô tả. Các lớp dẫn xuất của CBase luôn được phân bổ động trên heap, vì nếu chúng không được, các biến thành viên của chúng sẽ không được khởi tạo. Liệu cùng một quy ước áp dụng cho các lớp có nguồn gốc QObject?Các lớp có nguồn gốc không phải QObject "luôn luôn" được đặt trên ngăn xếp?

Trong Qt, có vẻ như thường được đặt, ví dụ như QString, trên ngăn xếp. Là các nội dung chuỗi đặt trên heap trong khi QString hoạt động như một container trên stack, hoặc là tất cả mọi thứ đưa vào ngăn xếp?

Trả lời

10

Như sje397 đã nói: Đó là thành ngữ để đặt QString và các vùng chứa trên ngăn xếp, vì chúng được chia sẻ hoàn toàn. Nội bộ của chúng (pimpl thành ngữ "d" con trỏ) được tạo ra trên heap. Không có điểm trong việc tạo ra các đối tượng chính nó trên heap, quá. Chỉ gây ra phức tạp về quản lý bộ nhớ và bạn mất các thuộc tính copy-on-write dự định khi truyền con trỏ tới các chuỗi/vùng chứa xung quanh.

QObjects mặt khác bạn muốn tạo trên đống trong hầu hết các trường hợp, nếu không chúng sẽ bị hủy ngay lập tức. Chúng không thể được sao chép hoặc gán (tốt, người ta có thể thực thi nó cho các lớp con riêng, nhưng các ngữ nghĩa QObject bị phá vỡ sau đó), và thường chúng được cho là tồn tại trong thân phương thức mà chúng được tạo ra. Ngoại lệ là QDialog, thường được tạo trên ngăn xếp, theo sau là QDialog::exec, sẽ chặn cho đến khi hộp thoại đóng. Nhưng ngay cả điều đó được nói một cách nghiêm túc là không an toàn, vì các sự kiện bên ngoài (các cuộc gọi RPC, các hoạt động nền) có thể khiến hộp thoại bị xóa bởi cha mẹ của nó (nếu chính bản thân nó bị xóa) trước khi exec trả về. Sau đó, có hộp thoại được tạo trên ngăn xếp sẽ gây ra xóa đôi khi mở ngăn xếp -> sự cố.

+0

Cảm ơn câu trả lời mở rộng. Nó, cùng với liên kết của sje397 xóa bỏ sự nhầm lẫn của tôi. – fejd

1

QString và nhiều lớp Qt khác, sử dụng implicit data sharing. Điều đó ngụ ý rằng bộ nhớ thường được cấp phát trên heap.

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