2015-10-08 24 views
8

Vui lòng xem hình bên dưới. Sau khi thay đổi giá trị của p1, bây giờ nó trỏ đến vị trí bộ nhớ B2. Điều gì đã xảy ra với phân đoạn bộ nhớ được tô bóng? Như tôi biết Nó sẽ vẫn còn cho đến khi khối mã hoàn thành thực hiện của nó. Những phân đoạn bộ nhớ bị thu hồi đó có thể được tái sử dụng một lần nữa để thực hiện chương trình không?Sử dụng bộ nhớ với con trỏ

char *p1 = "String"; 
char *p2 = "Another"; 
p1 = p2; 

Tiêu đề câu hỏi có thể gây hiểu nhầm. Tôi không thể tìm thấy một tiêu đề qood cho câu hỏi này. enter image description here

+2

Chuỗi ký tự có thời lượng lưu trữ tĩnh, vì vậy nó sẽ treo xung quanh cho đến khi kết thúc chương trình. Nếu bạn có một dòng khác 'p =" String ";' ở đâu đó nó có thể hoặc không thể trỏ đến cùng một chữ –

Trả lời

6

Điều gì đã xảy ra với phân đoạn bộ nhớ được tô bóng? Như tôi biết Nó sẽ vẫn còn cho đến khi khối mã hoàn thành thực hiện của nó.

Theo §2.13.5/8 một chuỗi chữ có thời gian lưu trữ tĩnh:

xâu thường và UTF-8 chuỗi literals cũng được gọi xâu như hẹp. Một chuỗi ký tự hẹp có kiểu “mảng của n const char”, trong đó n là kích thước của chuỗi như được định nghĩa bên dưới và có thời lượng lưu trữ tĩnh (3.7).

có nghĩa là, theo §3.7.1/1, họ kéo dài trong suốt thời gian của chương trình:

Tất cả các biến mà không có thời gian lưu trữ năng động, không có thời gian lưu trữ chủ đề và không phải là địa phương có thời gian lưu trữ tĩnh. Dung lượng lưu trữ cho các thực thể này sẽ kéo dài trong suốt thời gian của chương trình (3.6.2, 3.6.3).

Như một lưu ý phụ, bạn nên thực sự gán các chuỗi ký tự cho char const* hoặc char const[], không được char*. Lý do tại sao nó chủ yếu làm việc trong các trình biên dịch là vì các lý do tương thích ngược và trong C++ 11 nó đã bị phản đối.


những phân đoạn bộ nhớ garbaged có thể được tái sử dụng một lần nữa để thực hiện chương trình?

Theo §2.13.5/16 nó là không xác định cho dù họ đang tái sử dụng hay không:

Đánh giá kết quả một chuỗi chữ trong một chuỗi đối tượng theo nghĩa đen với thời gian lưu trữ tĩnh, khởi tạo từ các nhân vật được như đã nêu ở trên. Cho dù tất cả các chuỗi ký tự là khác biệt (có nghĩa là, được lưu trữ trong các đối tượng nonoverlapping) và cho dù các đánh giá liên tiếp của một chuỗi sản lượng cùng một hoặc một đối tượng khác nhau là không xác định. [Lưu ý: Hiệu quả của việc cố sửa đổi một chuỗi ký tự là không xác định. - lưu ý cuối]

0

Không cần phải sử dụng phân đoạn bộ nhớ cụ thể này một lần nữa trong quá trình thực thi chương trình. Những bộ phận này vẫn còn trong bộ nhớ cho đến khi cuộc sống của chương trình kết thúc. Ngay cả khi, tại một số thời điểm, bạn viết lại lệnh:

p1 = "String"; 

không có nghĩa là p1 sẽ trỏ đến phân đoạn bộ nhớ cụ thể đó. Nó có thể, nhưng nó có thể không.

0

Nó sẽ tiếp tục lơ lửng trong bộ nhớ miễn là nó không bị xóa bởi hệ thống."Dangling" vì không có con trỏ trỏ đến chuỗi đó.

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