30/09/2018, 17:04

Cấp phát động trong C++

Em đã delete mảng rồi mà sao khi xuất ra nó lại cho biến thứ 2 của mảng về giá trị 0 và giữ nguyên giá trị các biến còn lại ạ? ( em code bằng emacs)

#include<iostream>
using namespace std;

//new, delete and delete[]
int main(int argc, char *argv[])
{
  int sophantu;
  cin>>sophantu;
  int * mangCapPhatDong = new int[sophantu];
  for (int i=0; i < sophantu; i++)
    {
      mangCapPhatDong[i] = i;
      cout << mangCapPhatDong[i] << endl;
    }
  delete[] mangCapPhatDong;
  for (int i=0; i<sophantu; i++)
    {
      cout << mangCapPhatDong[i] << endl;
    }
  return 0;
}
Nguyễn Hữu Điền viết 19:10 ngày 30/09/2018

Bạn giải phóng bộ nhớ rồi thì làm gì còn gì nữa đâu mà in ra được

Gió viết 19:15 ngày 30/09/2018

Chưa xong việc mà bạn đã cho nó nghỉ ngơi thì chạy sai là chuyện bình thường mà (bạn chỉ giải phóng khi không cần tới nó nữa).

Itachi Citus viết 19:15 ngày 30/09/2018

Câu lệnh delete là bạn chỉ thông báo cho hệ điều hành biết là “Phần này tui không xài nữa” và trả quyền lại cho hệ điều hành. Dữ liệu được lưu trên đó sẽ được giữ nguyên nếu không có ứng dụng nào khác hoặc chính ứng dụng của bạn được cấp phát bộ nhớ mới trên vùng địa chỉ đó và ghi dữ liệu mới lên đó. Do đó trong trường hợp của bạn, dữ liệu được in ra ngay trực tiếp, do thời gian quá ngắn nên chưa có ai sử dụng phần bộ nhớ đó và dữ liệu được dữ nguyên.
Còn tại sao biến thứ 2 là giá trị 0 thì mình cũng… bó tay . Hơi lạ, hóng cao nhân.

Tran Huan viết 19:14 ngày 30/09/2018

delete [] ở đây chỉ giải phóng vùng nhớ và hệ điều hành thường sẽ không set các giá trị ở vùng nhớ này về 0,. Tuy nhiên việc truy xuất tới vùng nhớ này của bạn là rất nguy hiểm có thể gây crash chương trình bất cứ lúc nào, và các giá trị có thể bị thay đổi do vùng nhớ này được dùng ở chỗ khác. Bạn có thể hay thấy việc delete sẽ kèm theo phép gán con trỏ đó về null, để tránh việc delete nhiều lần hoặc được dùng ở nơi khác. Xem ví dụ

delete [] mangCapPhatDong;
mangCapPhatDong = NULL;
Bài liên quan
0