Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 19 kết quả

Đề tài: Sự khác biệt giữa 2 cách giải phóng mảng nhiều chiều?

  1. #1
    Ngày gia nhập
    01 2010
    Bài viết
    51

    Mặc định Sự khác biệt giữa 2 cách giải phóng mảng nhiều chiều?

    em ko hiểu sự khác nhau giữa 2 code giải phóng memory sau:
    Code:
    void DestroyGrid(char **a, int n, int m)
    {
    	delete [] *a;
    	delete [] a;
    }

    Code:
    void DestroyGrid(char **a, int n, int m)
    {
    	int i;
    	for (i = 0; i < n; i++) delete [] a[i];
    	delete [] a;
    }

  2. #2
    Ngày gia nhập
    01 2011
    Nơi ở
    -Mountain-
    Bài viết
    768

    Bạn trích dẫn ở đâu hay tự bạn đưa ra thế :S
    Hướng dẫn C++: https://www.youtube.com/watch?v=BwLodoQdoY4&list=PL1c9Uxlo-mplJDRGdONNupgo5OCBTyGGn

  3. #3
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    a không phải một class nên delete a thì tương đương với delete [] a;

    delete *a; thì tương đương với delete a[0];

    vậy code thứ nhất :delete a[0] .
    code thứ 2 delete a[i], i = 0-> n.

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    a không phải một class nên delete a thì tương đương với delete [] a;

    delete *a; thì tương đương với delete a[0];

    vậy code thứ nhất :delete a[0] .
    code thứ 2 delete a[i], i = 0-> n.
    Trong 4 phát biểu của bạn thì duy nhất phát biểu thứ 2 đúng (delete *a tương đương delete a[0])

    delete a và delete [] a là 2 lệnh khác nhau và không liên quan gì đến a có phải là 1 class hay không
    delete a là lệnh dùng để huỷ bỏ vùng nhớ cấp phát cho 1 biến bằng lệnh a = new X;
    delete [] a là lệnh dùng để hủy bỏ vùng nhớ cấp phát cho 1 mảng bằng lệnh a = new X[N]; (xin đừng lôi định nghĩa mảng ra bắt bẻ tui nhá - về ý nghĩa có thể coi là cấp phát mảng)

    Vì cơ chế quản lý bộ nhớ là phụ thuộc compiler nên bạn chỉ cần nhớ cấp phát bằng cách nào thì phải giải phóng đúng nguyên cách đó.
    Ví dụ bạn viết x = new int; thì phải giải phóng delete x;
    viết y = new int [1]; thì phải giải phóng delete [] y; (dù new int [1] cũng chỉ cấp phát bộ nhớ cho 1 biến int)

    Trong 2 function của chủ topic, function 1 sẽ giải phóng các vùng được khoanh trong khung mầu nâu (trong hình, bao gồm A0, A1, A2 và A00, A01, A02). function 2 sẽ giải phóng toàn bộ bộ nhớ đã được cấp phát cho a (trong hình, bao gồm 3 con trỏ A0, A1, A2 và các ô nhớ A[i][j] màu da cam)
    Attached Thumbnails Attached Thumbnails Untitled.jpg  
    Đã được chỉnh sửa lần cuối bởi fbchicken : 02-08-2011 lúc 04:41 PM.

  5. #5
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Trong 4 phát biểu của bạn thì duy nhất phát biểu thứ 2 đúng (delete *a tương đương delete a[0])

    delete a và delete [] a là 2 lệnh khác nhau và không liên quan gì đến a có phải là 1 class hay không
    delete a là lệnh dùng để huỷ bỏ vùng nhớ cấp phát cho 1 biến bằng lệnh a = new X;
    delete [] a là lệnh dùng để hủy bỏ vùng nhớ cấp phát cho 1 mảng bằng lệnh a = new X[N]; (xin đừng lôi định nghĩa mảng ra bắt bẻ tui nhá - về ý nghĩa có thể coi là cấp phát mảng)

    Vì cơ chế quản lý bộ nhớ là phụ thuộc compiler nên bạn chỉ cần nhớ cấp phát bằng cách nào thì phải giải phóng đúng nguyên cách đó.
    Ví dụ bạn viết x = new int; thì phải giải phóng delete x;
    viết y = new int [1]; thì phải giải phóng delete [] y; (dù new int [1] cũng chỉ cấp phát bộ nhớ cho 1 biến int)

    Trong 2 function của chủ topic, function 1 sẽ giải phóng các vùng được khoanh trong khung mầu nâu (trong hình, bao gồm A0, A1, A2 và A00, A01, A02). function 2 sẽ giải phóng toàn bộ bộ nhớ đã được cấp phát cho a (trong hình, bao gồm 3 con trỏ A0, A1, A2 và các ô nhớ A[i][j] màu da cam)
    bạn mới chỉ dựa vào lý thuyết suông, hay đã chứng minh delete khác delete[].

    delete một con trỏ đến class khác với delete một con trỏ vào vùng nhớ.
    nếu không dính dáng đến lập trình hướng đối tượng thì delete [] tương đương với delete

    xem trang 5 của topic này:
    http://forums.congdongcviet.com/show...t=62451&page=5

    Nếu không chứng minh được delete []p khác delete p thì thôi khỏi bàn cãi vấn đề này nữa.

  6. #6
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Mặc định Sự khác biệt giữa 2 cách giải phóng mảng nhiều chiều?

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    bạn mới chỉ dựa vào lý thuyết suông, hay đã chứng minh delete khác delete[].

    delete một con trỏ đến class khác với delete một con trỏ vào vùng nhớ.
    nếu không dính dáng đến lập trình hướng đối tượng thì delete [] tương đương với delete

    xem trang 5 của topic này:
    http://forums.congdongcviet.com/show...t=62451&page=5

    Nếu không chứng minh được delete []p khác delete p thì thôi khỏi bàn cãi vấn đề này nữa.
    Đúng là tôi chỉ lý thuyết suông thôi. Lý thuyết của tôi là dựa vào C++ standard document bảo rằng delete và delete [] là khác nhau. Dù 1 số compiler trong một vài trường hợp cụ thể có thể implement nó giống nhau đi nữa.
    Tôi chỉ ngó qua chứ không đọc kỹ link của bạn, cũng không quan tâm đến việc delete và delete[] dịch ra mã assembly giống nhau tại 1 số compiler nào đó hoặc kể cả trên toàn bộ các compiler hiện có, với 1 vài kiểu dữ liệu A B C X Y Z nào đó.
    Tranh luận dựa trên dẫn chứng, bạn có thể google về delete và delete[] thì sẽ thấy nói rõ cách dùng 2 cái đó. Nếu bạn muốn chứng minh bạn đúng thì phải tìm 1 link đủ tin cậy. Còn tôi thì chỉ thấy link nói delete khác delete [] thôi
    Nếu bạn cần ví dụ cụ thể thì đây: http://www.parashift.com/c++-faq-lit...html#faq-16.13 (C++ Faq lite là 1 trong những tài liệu rất nổi tiếng và hữu ích)

    Tôi đánh giá rất cao công sức của bạn giúp đỡ những anh em ở đây, vì vậy tôi không muốn tranh cãi theo kiểu "chứng minh là mình đúng" với bạn. Nhưng cái gì tôi thấy là sai thì tôi vẫn phải nói là sai, mong bạn không vì vậy mà tự ái

  7. #7
    Ngày gia nhập
    11 2010
    Bài viết
    41

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    (C++ Faq lite là 1 trong những tài liệu rất nổi tiếng và hữu ích)
    haha! E thấy trang này bác đưa lên trong mấy post rồi.
    Trang này hồi trước e cũng đưa lên mà chả ai chịu vô! po' chân,
    i dont care who are u, where yr from, what u did , as long as u love me

  8. #8
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    trong OOP thì delete khác delete [] là điều ko ai phủ định cả.

    nhưng nếu xóa một con trỏ trỏ vào một khối nhớ thì delete[] tuơng đuơng delete.

    bạn cứ đưa ra một đoạn code chứng minh 2 toán tử kia khác nhau đi, chỉ ngồi đọc lý thuyết thì sao biết được lý thuyết đúng hay sai.

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    trong OOP thì delete khác delete [] là điều ko ai phủ định cả.

    nhưng nếu xóa một con trỏ trỏ vào một khối nhớ thì delete[] tuơng đuơng delete.

    bạn cứ đưa ra một đoạn code chứng minh 2 toán tử kia khác nhau đi, chỉ ngồi đọc lý thuyết thì sao biết được lý thuyết đúng hay sai.
    Thế này nhé,
    1. trước hết bạn hãy thừa nhận với tôi là trong C++ standard không có nói đến trường hợp nào thì delete có thể dùng thay delete[] hoặc có tác dụng tương đương với delete[] cả
    2. Code non-stardard hay compiler-specific sẽ:
    - Không đảm bảo chạy đúng trên các platform khác nhau (win/linux/embedded...)
    - Không đảm bảo chạy đúng trên các compiler khác nhau
    - Không đảm bảo chạy đúng trên các version khác nhau của cùng 1 compiler
    3. Vậy, có dùng các tính năng non-stardard / compiler-specific hay không? Theo tôi, câu trả lời là: Có thể, nhưng phải được 1 lợi ích cụ thể nào đó.
    Vậy việc bạn dùng delete thay delete[] thì được lợi ích gì? Đỡ phí công gõ 2 dấu ngoặc?????

    Vì vậy, vấn đề có thể dùng delete thay cho delete[] hay không là không đáng để chứng minh,
    không cần phải bàn đến,
    và cơ bản là cũng không nên được đặt ra trừ khi chúng ta có quá nhiều thời gian rảnh rỗi.

    Còn về yêu cầu chứng minh của bạn thì link tôi đưa ra trong post trước có nói đến rồi đấy. Bạn chưa đọc kỹ thì mời đọc lại hoặc xem câu phát biểu lại dưới đây của tôi (cũng chưa chắc đã chính xác tuyệt đối, nhưng đầy đủ hơn phát biểu của bạn)

    1. Dòng 1: Cần phát biểu là:
    vì kiểu dữ liệu a trỏ đến không phải một class nên với 1 số compiler nhất định nào đó, trong điều kiện code của bạn (kể cả các thư viện bạn include) không định nghĩa lại operator delete[](void*) thì delete a tương đương với delete [] a;
    Có quá phức tạp không? 1 kiến thức như vậy thì bạn biết để làm gì khi tác dụng của nó chỉ là làm cho code bạn không thống nhất / không chuẩn và tiết kiệm được công sức gõ 2 dấu []? Khi bạn đã giỏi, bạn có thể tìm hiểu compiler ABC implement tính năng XYZ thế nào. Nhưng việc truyền những kiến thức như thế cho người mới là rất nguy hiểm và có hại nhiều hơn có lợi, nhất là kiến thức chưa đầy đủ
    2. 2 function của người ta đều có 2 phần, thì dòng 3 và 4 của bạn đều vứt bớt đi 1 phần và bảo func1 tương đương với delete a[0] (chưa nói đến do lỗi #1 nên dòng 4 cũng chẳng tương đương luôn). Còn phần delete [] a không thấy nói gì đến.
    Đã được chỉnh sửa lần cuối bởi fbchicken : 02-08-2011 lúc 11:54 PM.

  10. #10
    Ngày gia nhập
    01 2010
    Nơi ở
    Hà Nội
    Bài viết
    128

    Về việc delete và delete[] khác nhau ra sao mình tưởng topic mà pkthanh92 đưa ra đã rõ ràng rồi nhỉ .
    @pkthanh92: Bạn nên xem lại cách nhìn nhận của bạn đi chứ . Không phải ngẫu nhiên mà người ta đưa ra 2 khái niệm này và cũng chẳng liên quan gì tới class gì cả ,ý nghĩa thì fbchicken đã giải thích rất rõ rồi .

Các đề tài tương tự

  1. Trả lời: 1
    Bài viết cuối: 09-03-2014, 08:09 PM
  2. Trả lời: 0
    Bài viết cuối: 07-05-2013, 09:40 AM
  3. Trả lời: 1
    Bài viết cuối: 09-03-2013, 10:08 AM
  4. Chung Cư 257 Giải Phóng, st/cn Chung Cư 257 Giải Phóng với DT: 81m, 33tr
    Gửi bởi datphat191 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 16-02-2012, 01:37 PM
  5. Cấp phát và giải phóng mảng động 2 chiều
    Gửi bởi quangdl.khtn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 11
    Bài viết cuối: 07-09-2010, 02:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn