Thắc mắc về delete[] và new[] trong pointer

Em có hai đoạn code:

#include <iostream>
using namespace std;

int main()
{
    int *ptr = new int;

    cin >> *ptr;
    cout << *ptr << " at: " << ptr << endl;

    delete ptr;

    return 0;
}

và:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int num  = 0;
    cin >> num;
    int* myptr = new int[num];
    cout << myptr << endl;

    delete[] myptr;

    return 0;
}

Tại sao đoạn code 1 là new còn đoạn 2 là new[], em có thể tạm hiểu , có thể vì đoạn 1 khai báo giá trị trực tiếp lên pointer, còn đoạn 2 là gán lên 1 var khác, sau đó từ var khác đó gán lên pointer nên có syntax khác. Và liệu chúng cùng chức năng nhưng syntax khác hay còn có ẩn tình gì không :joy:

Còn về hàm deletedelete[] thì em không hiểu lắm. Chức năng của chúng khác nhau ở chỗ nào? Em đọc trong sách thì có thể tạm hiểu là delete chỉ có thể release memory ở những address đã được return bằng new. Còn delete[] thì release hết bộ nhớ của chương trình. Nhưng em không chắc cho lắm.

Mong được các anh giảng giải thêm về phần này. :hugs:

2 Likes

Bé Linh nay lại mò lại C++ à. Muốn hiểu rõ thì chắc e nên qua topic :point_down:

E nên chú ý vào 2 phần chính này, đọc song chắc tự trả lời đc r. :laughing:

Dynamically allocate single variables

new operator

Toán tử new được dùng để xin cấp phát vùng nhớ trên phân vùng Heap của bộ nhớ ảo.

usage of new operator

Cú pháp sử dụng toán tử new như sau:

new <data_type>;

Dynamically allocate arrays

Để xin cấp phát và giải phóng vùng nhớ cho mảng một chiều trên Heap , chúng ta cũng sử dụng toán tử new và delete để xử lý.

Dynamically allocate arrays

Đối với việc yêu cầu cấp phát bộ nhớ cho biến đơn trên Heap , chúng ta chỉ cần cung cấp kiểu dữ liệu cho toán tử new , hệ điều hành sẽ tự tính được kích thước cần cấp phát (tương tự việc sử dụng toán tử sizeof). Nhưng khi cần cấp phát một dãy vùng nhớ liên tục nhau (mảng một chiều), ngoài kiểu dữ liệu chúng ta cần cung cấp thêm số lượng phần tử.

new <data_type>[num_of_elements];
5 Likes

xưa giờ em cũng chỉ chung thủy với C++ thôi mà :sweat_smile:, cảm ơn anh nha, để em từ từ ngâm cứu.

4 Likes

Code 1 là cấp phát động cho một giá trị theo kiểu int (nôm na là một biến được trỏ bởi con trỏ p).

Còn Code 2 là cấp phát động cho một mảng một chiều kiểu int (bao gồm nhiều giá trị trong mảng đó). Lúc này, con trỏ sẽ trỏ đến mảng đó.

Cơ bản là nó khác ở hai đối tượng nó trỏ đến, tùy đề bài bạn cần sử dụng cái nào.

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