2016-09-22 22 views
11

Có thể sử dụng goto với nhãn gây rò rỉ bộ nhớ không? Tất cả những gì tôi tìm thấy trong số documentation for goto dường như có liên quan là:Có thể `goto LABEL` gây rò rỉ bộ nhớ không?

Biểu mẫu goto LABEL tìm thấy câu lệnh có nhãn LABEL và tiếp tục thực hiện ở đó.

Có an toàn khi sử dụng goto LABEL?

+6

http://www.perlmonks.org/?node_id=1159029 có thể giúp – Dada

+0

Trong Perl, nếu bạn không tạo bất kỳ phụ thuộc vòng tròn nào (ví dụ: tham chiếu đến những điều tự quay lại) bạn tự thanh lọc, mọi thứ được dọn sạch (thu gom rác tự động) khi phạm vi hiện tại thoát. Phạm vi cuối cùng là tập tin kịch bản chính nó. – stevieb

+4

tất cả những gì đã nói, tôi khuyên bạn nên cấu trúc mã theo cách không cần 'goto' (nó khá dễ). Nếu trong một vòng lặp, chúng ta có 'next' và' last'. – stevieb

Trả lời

2

Sau 1 phút thử nghiệm, câu trả lời có vẻ là: không (xem cập nhật dưới đây)

Watching top trong khi điều này đang chạy, %MEM tục increments

{ 
    THIS: 
    my $x = 1; 
    goto THIS; 
} 

này không không trưng bày cùng số tiền tăng %MEM truy cập

while (1) { 
    my $x = 1; 
} 

CẬP NHẬT

Tôi hiểu nhầm câu hỏi. Câu hỏi của tôi là liệu bộ nhớ có được phân bổ cho một biến từ vựng đã tồn tại trong phạm vi từ vựng đó với việc sử dụng một số goto và thử nghiệm của tôi có vẻ là có. Nói đúng ra, đây không phải là rò rỉ bộ nhớ. Nên perl bao giờ thoát khỏi phạm vi từ vựng này, không gian được phân bổ sẽ được giải phóng.

+9

không bị rò rỉ, vì perl không mất dấu vết của bộ nhớ và sẽ giải phóng tất cả khi thoát khỏi phạm vi. – ysth

+0

chỉ để chắc chắn rằng tôi có được điều này, trong ví dụ của bạn, Perl sẽ vẫn theo dõi tất cả 'my $ x's cho mỗi' goto' và trong trường hợp này, cuối cùng sẽ lấp đầy tất cả bộ nhớ có sẵn? – yonyon100

+0

yonyon100: có vẻ như vậy, vâng. Tôi chỉ chạy ví dụ đầu tiên trong khoảng 1 phút, và sử dụng bộ nhớ tiếp tục leo lên. – Joshua

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