2013-02-15 56 views
7

Tôi viết một số mã như thế này:Tôi có phải xóa một mảng tĩnh trong C++ không?

while(true) { 
    int array[5]; 
    // do something 
} 

Đối với mỗi lượt của vòng lặp, mảng là một mảng mới. Tôi có cần xóa mảng ở cuối vòng lặp không?

+4

Quy tắc ngón tay cái: chính xác một 'xóa' cho mỗi 'mới'; chính xác một 'xóa []' cho mỗi 'new []'. –

+0

câu hỏi này đã được hỏi rất nhiều lần gần như trong cùng một hình thức chính xác. quy tắc của pinky ... tìm kiếm dups đầu tiên, đặc biệt là nếu nó là một câu hỏi đơn giản. – thang

Trả lời

12

Tôi có cần xóa mảng ở cuối vòng lặp không?

Không, bạn không cần xóa vì array có thời lượng lưu trữ tự động. Nó sẽ được phát hành khi đi ra khỏi mỗi vòng lặp while.

Bạn cần gọi delete []/new []delete/new theo cặp.

+0

bạn có thể? – dtc

+0

@ dtc nope, bạn không thể xóa các đối tượng không được tạo mới. – billz

+0

ok, cảm ơn câu trả lời nhanh. chỉ tò mò: P. – dtc

1

No.

Các biến được khai báo trên ngăn xếp không cần phải được deallocated theo cách thủ công. Mảng của bạn được sắp xếp trong vòng lặp while. Đối với mỗi lần lặp của vòng lặp, mảng được cấp phát trên ngăn xếp và sau đó tự động được phân bổ lại.

Chỉ một mảng khai báo với new[] phải được deallocated bằng tay với delete[]

Ngoài ra, các mảng bạn khai báo không phải là static trong bất kỳ ý nghĩa. Từ khóa static có ý nghĩa cụ thể trong C. Mảng bạn khai báo thực sự được lưu trữ dưới dạng biến số tự động auto (lưu trữ tự động), có nghĩa là từ khóa được tự động phân bổ khi nó nằm ngoài phạm vi.

0

Bạn không thể (trừ khi bạn sử dụng một số cụm phức tạp) và không cần xóa mảng hoặc đối tượng được phân bổ trên ngăn xếp.

Nếu vì một lý do nào bạn cảm thấy cần phải xóa các mảng tạo ,:

int *array = new int[5]; 
//do something 
delete[] array; 

Ngoài ra, lời khuyên của tôi là sử dụng std::vector thay vì mảng.

+0

Tại sao bạn luôn sử dụng một cái gì đó từ thư viện chuẩn mà không biết ứng dụng là gì? –

0

Câu trả lời khác đã giải thích chính xác rằng delete là không cần thiết vì mảng của bạn nằm trong ngăn xếp, nhưng chúng chưa giải thích được ngăn xếp là gì. Có một lời giải thích tuyệt vời ở đây: What and where are the stack and heap?

Vì nó áp dụng cho câu hỏi của bạn: trong C và C++, trừ khi bạn nói rõ ràng trình biên dịch, các biến của bạn được đặt trong ngăn xếp, nghĩa là chúng chỉ tồn tại trong phạm vi là, khối) mà chúng được khai báo. Cách để trình bày rõ ràng trình biên dịch để đặt thứ gì đó lên heap là hoặc với malloc (cách C) hoặc new (cách C++). Chỉ khi đó bạn mới cần gọi số free (trong C) hoặc delete/delete[] (C++).

+0

Có, có thể là do "xóa" không nên có bất kỳ ý nghĩa nào khi được áp dụng cho các biến trên ngăn xếp. Bạn có thể đề xuất một từ ngữ tốt hơn không? –

+0

(Lý do tôi nói theo cách đó là vì câu hỏi ban đầu là "tôi cần ** để xóa mảng", nghĩa là cần phải làm như vậy, và câu trả lời là không, không cần thiết.) –

+0

Vâng, tôi đã có nghĩa là đống. Cảm ơn. Mặc dù điều đó sẽ hữu ích hơn khi nhận xét hơn là chỉnh sửa đối với nhận xét cũ vì tôi không thực sự nhận được thông báo cho bản chỉnh sửa. –

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