2009-02-25 31 views
6
class MyWidget : public QWidget { public: 
    MyWidget(QWidget *parent=0, const char *name=0); }; 


MyWidget::MyWidget(QWidget *parent, const char *name) 
     : QWidget(parent, name) { 
    QPushButton *quit = new QPushButton("Quit", this, "quit"); 
    quit->setGeometry(62, 40, 75, 30); 
    quit->setFont(QFont("Times", 18, QFont::Bold)); 
} 

Trong đoạn mã trên quit được phân bổ trong Heap và nó là cần thiết vì nó là con của MyWidgetTại sao Qt cần phân bổ các đối tượng con trong Heap?

Tại sao nhu cầu Qt phân bổ của các đối tượng trẻ em trong Heap?

+1

Nếu tôi đoán những gì bạn có nghĩa là, câu hỏi của bạn có vẻ ngớ ngẩn, vì vậy tôi cho rằng tôi sai như ý nghĩa của bạn, vì vậy bạn nên alliterate. – mxcl

Trả lời

0

Tôi nghĩ rằng ý tưởng ở đây là Qt có riêng của nó đếm tham khảo nội bộ trên hầu hết các đối tượng và nếu bạn chuyển chúng xung quanh, sử dụng bản sao-on-viết, vv

Ông có thể cụ thể hơn trong câu hỏi của bạn?

+1

Các đối tượng được chia sẻ hoàn toàn làm ** phân bổ đống ** nội bộ cho dữ liệu PIMPL, nhưng đó là một chi tiết thực hiện. Một trường hợp phổ biến mà bạn có thể có đối tượng được tính tham chiếu chỉ ngăn xếp là truyền bất kỳ thứ gì được chia sẻ hoàn toàn qua sự kiện được gửi hoặc tín hiệu được kết nối trực tiếp. Giả sử, khi bạn chuyển một 'QString' vào một vị trí bằng cách sử dụng kết nối trực tiếp. Không có trường hợp chuỗi nào tồn tại trên heap. PIMPL sống trên heap - nhưng một lần nữa, đó không phải là câu hỏi. –

+0

Cảm ơn thông tin chi tiết. – ypnos

+0

Nếu họ đang ở trên đống, và các đối tượng con thông báo cho cha mẹ của việc xóa của họ, sau đó bạn có tùy chọn để xóa chúng khá tùy tiện. – spraff

-1

Có các tùy chọn nào khác? Từ ngăn xếp? Làm thế nào Qt sẽ biết khi nào để phân bổ từ ngăn xếp và khi nào từ heap? Những thứ được phân bổ từ ngăn xếp sẽ biến mất ngay sau khi hàm hiện tại trả về, do đó tuổi thọ của đối tượng có thể ngắn hơn nhiều so với thời gian sử dụng. Hãy tưởng tượng thêm một nút vào một cái cây. Nút này sẽ được sử dụng lâu sau khi hàm hiện tại đã trả về. Điều này sẽ dẫn đến truy cập vào bộ nhớ ngẫu nhiên, lỗi phân đoạn, bãi lõi, v.v.

+1

Bạn có thể có chúng dưới dạng thành viên giá trị trong một lớp tiện ích con khác, để tránh phân bổ nhiều đối tượng nhỏ trên toàn bộ vùng. – Macke

+0

Làm thế nào Qt sẽ biết bạn đã làm gì khi nó bắt đầu dọn dẹp bộ nhớ trong bộ hủy? –

+2

Các đối tượng thành viên bị phá hủy trước tiên, vì vậy chúng tự hủy cha mẹ khỏi cha mẹ của chúng. Sau đó, cha mẹ bị phá hủy. Không có vấn đề gì cả. (Công trình này, đó là cách tôi đã làm nhiều lần. Chỉ cần cẩn thận với việc sử dụng boost :: shared_ptr và mọi thứ sẽ ổn thôi.) – Macke

2

Nếu tôi hiểu những gì bạn yêu cầu chính xác, tôi nghĩ nó chủ yếu là truyền thống và ví dụ, với một chút phụ thuộc tiêu đề ném vào.

Cách khác, tất nhiên, là khai báo quit làm biến thành viên MyWidget. Nếu bạn làm điều này, thì bạn sẽ cần phải bao gồm tệp tiêu đề cho QPushButton trong đó MyWidget được khai báo thay vì trong tệp triển khai. Ví dụ bạn đưa ra cũng dựa vào mối quan hệ cha mẹ của QObject s để theo dõi bộ nhớ cho nút và xóa nó khi hủy, vì vậy nó không cần phải được chỉ định làm thành viên trong lớp.

Tôi chắc chắn bạn có thể thay đổi thành phân bổ stack nếu bạn thực sự muốn.

5

Trong ví dụ thoát, bạn không phải phân bổ heap.

Mã này biên soạn và thực hiện tốt:

struct MyWidget : QWidget 
{ 
    QPushButton quit; 

    MyWidget() 
    { 
     quit.setGeometry(62, 40, 75, 30); 
     quit.setFont(QFont("Times", 18, QFont::Bold)); 
    } 
}; 
+4

Nó cũng hoạt động nếu bạn thêm MyWidget làm cha mẹ vào nút thoát (điều thú vị hơn, tôi suy nghĩ). Nút bị hủy trước MyWidget và do đó bị bỏ qua trước khi MyWidget bị phá hủy. – Macke

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