Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Lỗi cấp phát bộ nhớ

    Mình đang làm 1 bài tập về class, thì phát hiện lỗi về cấp phát động, nguyên nhân là hàm delete ở detructor, sau đó mình viết 1 ct để test thì vẫn gặp lỗi tương tự:
    Mã:
     //mình ko tạo empty project
     #include "stdafx.h"
    
     int main()
     {
             int **test;
             int i;
             test= new*[3];
             for(i=0;i<3;i++)
             {
                     test[i]=new int[1];
                     test[0][i]=0;
             }
    
             for(i=0;i<3;i++)
                     delete[] test[i];
             delete[] test;
    
             return 0;
     }
    }
    đoạn code chỉ là tạo 1 mảng con trỏ gồm 3 phần tử, mỗi phần tử là 1 mảng 1 chiều (mình cho mảng chỉ có 1 pt để đơn giản)

    khi debug thì phát hiện lỗi ở delete[] test[i]
    thông báo lỗi như sau :

    "Windows has triggered a breakpoint in alloc.exe. // alloc là tên file project của mình
    This may be due to a corruption of the heap, which indicates a bug in
    alloc.exe or any of the DLLs it has loaded.
    This may also be due to the user pressing F12 while alloc.exe has focus.
    The output window may have more diagnostic information."
    vào output window thì phát hiện dòng
    "HEAP[alloc.exe] Heap block at X modified at Y past requested size of 28"
    X và Y là mã hex,mình đoán là địa chỉ ô nhớ.
    Note:
    - mảng 1 chiều ko gặp lỗi.
    - không gọi delete thì ct vẫn chạy bt.
    - chỉ bị lỗi khi delete[] test[i] với i =0.
    - khi mảng 2 chiều chỉ có 1 phần tử thì delete[] test[0] vẫn
    hoạt động bt.


    Nhờ mọi người kiểm tra giúp xem lỗi này là gì và xử lý như thế nào vậy!

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    test[i][0]=0; chứ ko phải là [0][i]. Dòng trên cấp phát test[i] có 1 int dòng dưới lại test[0] rồi [i] thì tức là truy cập phần tử thứ i của mảng test[0], mà test[0] được cấp phát 1 int nên chỉ truy cập được [0], trong khi [i] có thể lên tới [1] hay [2] => lỗi "Heap block at X modified at Y past requested size of 28" tức là ô (block) ... bị chỉnh sửa (ở đây là phép gán =0) tại ... quá kích thước cung cấp (ở đây là new int[1], tức là kích thước có 1 int mà chỉnh sửa phần tử thứ [1] hay [2])

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •