Trong C++, vị trí lưu trữ phụ thuộc vào cách tạo đối tượng:
- Stack: Biến cục bộ, tham số hàm, đối tượng tạo bằng cú pháp thường
Type obj;bên trong block/hàm. Tự động hủy khi ra khỏi scope. - Heap: Đối tượng tạo bằng
new, tồn tại cho đến khidelete.
Ví dụ minh họa
#include <iostream>
using namespace std;
class Box {
int width, length;
public:
Box(int l=0, int w=0) : length(l), width(w) {}
~Box() { cout << "Box is destroying\n"; }
int get_len() { return length; }
int get_width() { return width; }
};
int main() {
{ // Block lồng
Box b(2, 3); // Trên STACK
cout << "Box dimension: " << b.get_len() << "x" << b.get_width() << endl;
} // b hủy tự động ở đây
cout << "Exiting block, destructor called automatically.\n";
Box* box_ptr;
{
Box* box_ptr1 = new Box(5, 6); // Trên HEAP
box_ptr = box_ptr1;
cout << "Box 2: " << box_ptr1->get_len() << "x" << box_ptr1->get_width() << endl;
delete box_ptr1; // Hủy thủ công
}
// box_ptr giờ thành dangling pointer!
cout << "After delete: " << box_ptr->get_len() << "x" << box_ptr->get_width() << endl; // UB
return 0;
}
Kết quả
Box dimension: 2x3 Box is destroying Exiting block, destructor called automatically. Box 2: 5x6 Box is destroying After delete: 0x0 // Undefined behavior, giá trị rác
Tóm tắt
| Loại | Vị trí | Quản lý vòng đời |
|---|---|---|
| Biến cục bộ | Stack | Tự động (RAII) |
| new | Heap | Thủ công (delete) |
| static/thread_local | Data segment | Chương trình kết thúc |
Lời khuyên: Ưu tiên stack và smart pointer (unique_ptr, shared_ptr) để quản lý heap an toàn.