Tôi đang bối rối về việc cấp phát bộ nhớ trong C++ về mặt bộ nhớ như vùng dữ liệu Const, Stack, Heap, Freestore, Heap và Global/Static area. Tôi muốn hiểu mẫu phân bổ bộ nhớ trong đoạn mã sau. Bất cứ ai có thể giúp tôi hiểu điều này. Nếu có bất kỳ điều gì khác ngoài các loại biến được đề cập trong ví dụ để giúp hiểu khái niệm tốt hơn, vui lòng thay đổi ví dụ.Phân bổ bộ nhớ trong C++
class FooBar
{
int n; //Stored in stack?
public:
int pubVar; //stored in stack?
void foo(int param) //param stored in stack
{
int *pp = new int; //int is allocated on heap.
n = param;
static int nStat; //Stored in static area of memory
int nLoc; //stored in stack?
string str = "mystring"; //stored in stack?
..
if(CONDITION)
{
static int nSIf; //stored in static area of memory
int loopvar; //stored in stack
..
}
}
}
int main(int)
{
Foobar bar; //bar stored in stack? or a part of it?
Foobar *pBar; //pBar is stored in stack
pBar = new Foobar(); //the object is created in heap? What part of the object is stored on heap
}
EDIT:
gì confuses me là, nếu pBar = new Foobar();
lưu trữ các đối tượng trên heap, làm thế nào mà int nLoc;
và int pubVar;
, đó là những thành phần của đối tượng được lưu trữ trên stack? Âm thanh mâu thuẫn với tôi. Chẳng lẽ tuổi thọ của pubvar
và pBar
có giống nhau không?
Ý tưởng tốt nhất là ngừng suy nghĩ về đống và ngăn xếp. Chúng không thực sự tồn tại trong C++ (một cấu trúc Java/C#) của nó. Suy nghĩ về tuổi thọ (duration) của một đối tượng. –
Waitaminute. Ngăn xếp là một cấu trúc Java? Chắc chắn không phải. Đó là một cấu trúc C, nếu không lớn hơn. Nhưng 'setjmp/longjmp' làm cho nó rất rõ ràng rằng C có một chồng. Java mặt khác cho phép các đối tượng thoát khỏi phạm vi chức năng, đó là lý do tại sao khái niệm ngăn xếp không tồn tại (bộ nhớ wrt; ngoại lệ là một vấn đề khác) – MSalters