2013-02-23 69 views
5

Trong mảng 1D đơn giản:Làm thế nào để xóa mảng 2D này trong C++

node *nodes = new node[MAX_NODES]; 

Xóa bởi:

delete [] nodes; 

Xóa tất cả các nút phân bổ trong mảng.

Nhưng trong trường hợp này:

float (*buildingArray)[3] = new float[10][3]; 

Liệu tuyên bố này làm cho buildingArray một mảng không gian duy nhất của con trỏ 3 phao? Và đây là dòng deallocation:

delete[] buildingArray; 

Thoả thuận trên đây có bị xóa không, nhưng tôi nghi ngờ về việc liệu nó có xóa tham chiếu của nó không?

+0

Sử dụng véc tơ thay thế - http://www.cplusplus.com/reference/vector/vector - Đơn giản hơn rất nhiều. –

+5

Đôi khi một cơ sở mã hiện có buộc chúng ta sử dụng các mảng 2 chiều. Nếu tôi có thể downvote ý kiến ​​.... – codetaku

Trả lời

15

Tính năng phân bổ cấp trên có xóa mảng không?

Có.

Đơn giản chỉ cần làm theo các quy tắc:

Bạn cần phải gọi delete hoặc delete [] nhiều lần bạn gọi new hoặc new [] tương ứng.


Nếu bạn có một chuỗi con trỏ trong đó mỗi chỉ mục được cấp phát bộ nhớ động, bạn cần lặp lại rõ ràng và xử lý từng yếu tố mảng một cách rõ ràng.


Trên một mặt lưu ý bạn là tốt hơn nhiều bằng cách sử dụng một mảng std::vector hoặc std::array chứ không phải phân bổ tự động.

+0

okay như vậy ở đây mỗi phần tử không có bộ nhớ động, chỉ có 1 chiều (hàng) có bộ nhớ động và 3 cột có bộ nhớ tĩnh, vì vậy không cần phải de -allocate chúng. Tôi có đúng không? – Anubha

+0

@Anubha: Câu lệnh 'float (* buildingArray) [3] = new float [10] [3];' phân bổ đủ bộ nhớ động để lưu trữ một mảng gồm 10 mảng 3 float. Toàn bộ lưu trữ là trên freestore (aka heap). Nhưng kể từ khi nó được cấp phát bằng cách sử dụng một cuộc gọi duy nhất tới 'new []', một cuộc gọi duy nhất để 'delete []' dellocates nó hoàn hảo. –

+0

ok, vì vậy trong câu hỏi này http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new, việc khởi tạo mảng đã sử dụng 2 câu lệnh mới, do đó xóa đơn giản [] ary; sẽ không làm việc trong trường hợp đó? – Anubha

2

new float[10][3] phân bổ một mảng gồm 10 mảng 3 floats và trả về con trỏ đến phần tử đầu tiên (là mảng gồm 3 phần nổi).

Gọi delete[] trên con trỏ này làm cho toàn bộ mảng bị xóa.

Sự khác biệt duy nhất giữa hai trường hợp là trong trường hợp đầu tiên, loại giá trị được lưu trữ trong mảng được phân bổ động là float và trong trường hợp thứ hai loại là float[3].

3

Có. Giải thích là vì không có thông tin trong bộ nhớ về số lượng mảng của bạn.

Nếu bạn có mảng 3 * 4 mục, nó chính xác giống với mảng 12 mục. Nó chỉ là cách bạn giải quyết các yếu tố cụ thể (được lưu trữ trong một dòng sau khi dòng thời trang) mà thay đổi.

Vì vậy, delete[] sẽ hoạt động hoàn hảo.

Nhưng sử dụng newdelete nhà khai thác không quá phổ biến trong những ngày này với smart pointers, trừ khi bạn thực sự có lý do chính đáng để tự kiểm soát phân bổ.

Các vấn đề liên quan