01/10/2018, 00:38

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ì ạ ? Em cảm ơn

Người bí ẩn viết 02:40 ngày 01/10/2018

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ớ, …

Thành Lê viết 02:53 ngày 01/10/2018

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 ?

Người bí ẩn viết 02:55 ngày 01/10/2018

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) , .... [quote="Thanh_Le2, post:3, topic:37739"] Vậy cần gì phải có new vậy a [/quote]

    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ớ.

    Thành Lê viết 02:52 ngày 01/10/2018

    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 ?

    Người bí ẩn viết 02:45 ngày 01/10/2018

    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.

    Thành Lê viết 02:39 ngày 01/10/2018

    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ười bí ẩn viết 02:55 ngày 01/10/2018

    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

    Đúng rồi.

    Thành Lê viết 02:44 ngày 01/10/2018

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

    Người bí ẩn viết 02:41 ngày 01/10/2018

    Like và subscribe đi nào

    Minh Luong viết 02:53 ngày 01/10/2018

    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ế ạ?

    Người bí ẩn viết 02:44 ngày 01/10/2018

    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

    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

    Bài liên quan
    0