Toán tử new, delete trong c++ hoạt động như thế nào, dùng để làm gì?

Em mới đọc sách sách sang phần này nhưng vẫn ko hiểu , xin A/C giải đáp thắc mắc e là new và delete hoạt động như thế nào ? nó để làm gì ạ ? :smiley: Em cảm ơn

4 Likes

Toán tử new dùng để cấp phát bộ nhớ cho 1 con trỏ.
VD:

int *a = new int; // cấp phát bộ nhớ cho con trỏ a thuộc kiểu int (4 bytes)
double *arr = new double[5]; // cấp phát 5 ô nhớ cho mảng arr thuộc kiểu double (8 bytes)

Còn toán tử delete dùng để giải phóng 1 con trỏ đã được cấp phát trước đó, còn nếu đó là 1 mảng thì dùng delete[]
VD:

int *a = new int;
// do_something;
delete a; // giải phóng con trỏ a đã cấp phát ở trên

double *arr = new double[5];
// do_something;
delete[] arr; // giải phóng mảng arr đã được cấp phát ở trên

Còn cấp phát và giải phóng để làm gì thì bạn sẽ được học khi học tới con trỏ nhé.
Hoặc có thể dùng tính năng search của diễn đàn để tìm những bài viết nói về con trỏ, cấp phát động, giải phóng bộ nhớ, …

5 Likes

E đang học tới phần con trỏ , nhưng theo en ghĩ là khi khai biến bất kỳ ví dụ như : int x thì x đã được cấp phát bộ nhớ . Vậy cần gì phải có new vậy a ?

Thế này nhé.
Trong bộ nhớ ảo của máy được chia làm 4 phần.

  • Code segment: Là nơi chứa mã máy dạng nhị phân
  • Data segment: Là nơi chứa các biến tĩnh (static) và biến toàn cục
  • Heap: Là vùng nhớ không do CPU quản lý, lập trình viên phải tự quản lý vùng nhớ này. Hay nói các khác, đây là vùng nhớ dành cho con trỏ
  • Stack: Đây là vùng nhớ do CPU quản lý, lập trình viên không được phép "can thiệp" vào vùng nhớ này. Vùng nhớ này chứa các biến cục bộ
  • Khi bạn tạo biến x bằng cách `int x;` thì nó sẽ được tạo trong vùng nhớ Stack. Mà khi được tạo trong Stack thì bạn không được phép "can thiệp" như giải phóng (delete) , ....

    Không cần bạn nhé. Khi nào tạo biến con trỏ thì mới cần cấp phát bộ nhớ.

    10 Likes

    Vậy là int* a = int x , cái chỗ int x là do mình cấp phát bộ nhớ cho biến đó và cũng có thế xóa đi bằng delete . Em hiểu vậy đúng ko a ?

    Không có vụ int *a = int x đâu nhé.
    Như thế này thì được:

    int x;
    int *a = &x;
    

    Hiểu 1 cách nôm na là cho con trỏ a trỏ tới biến x kiểu int đã được khởi tạo trong Stack. Trong trường hợp này, cả 2 đều nằm trong Stack nên không thể giải phóng bằng toán tử delete … và con trỏ a cũng không cần phải cấp phát khi đã trỏ tới thằng khác.

    2 Likes

    Vậy là cái int * pt = new int , cái biến trỏ này giúp mình tự tạo ra biến này rồi mình tự hủy được . Không như biến int x ; nó không tự hủy được vì nó nằm trong vùng hệ thống của CPU . Phẩi hông a ?

    Đúng rồi.

    3 Likes

    em cảm ơn a nhiều :smiley: e hiểu r

    1 Like

    Like và subscribe đi nào :joy:

    16 Likes

    Người bí ẩn cho e hỏi, ứng dụng của việc cấp phát bộ nhớ cho con trỏ là gi, nó được dùng làm gì trong thực tế ạ?

    1 Like

    Cái này mình cũng không rõ lắm.

    Thực ra, con trỏ dùng để áp dụng cho mảng động là chính. Chính vì sự di chuyển tự do trong bộ nhớ nên nó cũng tiện lợi nhưng dễ gây ra lỗi nếu không rành hoặc không cẩn thận :slight_smile:

    Còn việc cấp phát bộ nhớ là điều hiển nhiên nếu muốn thao tác trên con trỏ, trừ khi mình đã trỏ nó tới 1 “ngôi nhà” khác !

    #my_personal_idea

    5 Likes

    @tcm
    Như này đúng không b?

    int a; // biến Stack
    int a = new a; // là biến mình tự cấp phát 
    

    nếu mình khai báo như này int a = new a; thì nó không liên quan đến biến int a; phải không b?

    vậy cho em hỏi, sau khi giải phóng vùng nhớ bằng câu lệnh delete thì con trỏ vẫn còn trỏ tới vùng nhớ đó nhưng giá trị tại vùng nhớ đó có còn không ạ

    Cấp phát này gọi là “động” vì kích thước không bị cố định trong code mà đến runtime mới biết.

    • Cấu trúc dữ liệu :smiley:
    • Áp dụng đa hình

    Hên xui, chỉ có thể chắc chắn là không được truy cập vào :slight_smile:

    2 Likes

    Chào bạn ạ, những kiến thức trên bạn học ở tài liệu nào vậy ? Bạn chia sẽ cho mình được học với . Mình mới bắt đầu học thôi, nên rất mơ hồ, mong bạn giúp đỡ. Mình cảm ơn ạ.

    Đó là cấu trúc file thực thi trong một hệ điều hành. Đào sâu vào thêm thì còn chỗ nạp thư viện ngoài nữa.

    2 Likes
    83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?