2009-09-22 33 views
7
class A 
{ 
public: 
    A(); 
    ~A(); 
    int X; 
}; 

A::A() 
{ 
    X = 5; 
    int Y = 4; 
} 

//..... in another file 
A * objectOnHeap = new A(); 

Trong trường hợp này, vì "objectOnHeap" là trên heap, X cũng có trên heap mặc dù nó không phải là đặc biệt mới? Và trong trường hợp này Y được cấp phát trên ngăn xếp (và tất nhiên nằm ngoài phạm vi), đúng không?Biến thành viên của một đối tượng trên heap cũng tự động trên heap?

Tôi tự hỏi nếu tôi đã nhận được dây của tôi vượt qua khi cố gắng để hình dung cách thức các đối tượng được lưu trữ trong bộ nhớ.

+1

'objectOnHeap' là * không * trên heap. Nó nằm trên ngăn xếp hoặc trong phân đoạn dữ liệu. Giá trị của nó là một con trỏ, mà * điểm * cho một cái gì đó trên đống. –

+0

@Rob Kennedy, bạn có thể giải thích về phân đoạn dữ liệu không? Tôi thấy điểm của bạn mặc dù con trỏ chính nó là trên stack nhưng dữ liệu nó trỏ đến được lưu trữ trên heap. – BuckFilledPlatypus

Trả lời

17

Có. Đó là trên đống. Về cơ bản, không gian được phân bổ cho một đối tượng trên heap là đủ lớn để chứa tất cả các biến thành viên của nó.

5

Có, nó nằm trên heap.

Một số chi tiết: Khi bạn sử dụng các nhà điều hành "mới", những gì xảy ra là trình biên dịch phân bổ đủ không gian trên heap cho lớp, bao gồm tất cả các không gian cần thiết cho tất cả các biến thành viên (mà cũng có thể là các lớp, trong trường hợp đó kích thước của chúng cũng cần được tính toán, v.v.).

Sau đó, hàm tạo được gọi trên các lớp thành viên dữ liệu, sau đó trên chính lớp đó.

Bất cứ khi nào bạn không phân bổ bộ nhớ cụ thể trên heap (thường bằng cách sử dụng toán tử mới hoặc gọi hàm cho bạn), bộ nhớ được cấp phát trên ngăn xếp, như biến y trong ví dụ của bạn.

3

Tôi đoán một nửa câu hỏi của bạn vẫn chưa được trả lời: bạn đã hỏi liệu Y vẫn được cấp phát trên ngăn xếp, điều đó đúng là đúng.

0

Y đang ở trên ngăn xếp kể từ khi được tạo cục bộ; X là trên heap.

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