Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Đối tượng được lưu ở đâu khi tạo bên trong block trong C++?

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 khi delete.

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ạiVị tríQuản lý vòng đời
Biến cục bộStackTự động (RAII)
newHeapThủ công (delete)
static/thread_localData segmentChươ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.