2010-07-27 76 views
5

Điều này có hợp pháp/nguy hiểm không?Con trỏ biến tĩnh?

int* static_nonew() 
{ 
    static int n = 5; 
    return &n; 
} 

Trình biên dịch dường như không có vấn đề gì với nó, nhưng bản thân vị trí con trỏ có được bảo vệ khỏi bị ghi đè khi người khác cần bộ nhớ không?

EDIT: Một chút giải thích thêm về lý do tôi hỏi câu hỏi này. Lưu ý: Tôi đang lập trình trong C++, tôi chỉ gắn thẻ nó là C vì nó dường như có nhiều câu hỏi C hơn C++.

Tôi có một lớp học có nghĩa vụ trả lại bản đồ tĩnh. Tôi chỉ muốn bản đồ này được khởi tạo một lần trong suốt chương trình vì dường như không cần phải làm nhiều lần. Vì lý do này, tôi sẽ có một cái gì đó như thế này:

static std::map<std::string, Transition*> transitions; 
static Transition trans1(transitions, ...); 
static Transition trans2(transitions, ...); 
return &transitions; 

Trình tạo lớp chuyển tiếp sẽ tự thêm vào quá trình chuyển đổi. Theo cách đó, nó sẽ tạo ra các chuyển đổi một lần và sau đó trả về một con trỏ cho chúng. Tôi chỉ nhớ rằng nếu bạn tạo một tham chiếu đến một biến được phân bổ trên ngăn xếp, nó có thể bị ghi đè rất dễ dàng và "không an toàn". Tôi chỉ là một chút nhầm lẫn với chính xác như thế nào các biến tĩnh được tạo ra trong một chức năng làm việc.

+0

Nếu bản đồ của bạn không được dự kiến ​​sẽ bị thay đổi bởi mã máy khách, bạn phải trả về tham chiếu const hoặc một con trỏ tới một const. Điều đó sẽ loại bỏ hầu hết các rủi ro liên quan đến dữ liệu tĩnh. –

Trả lời

5

Đây là mã hợp lệ và hữu ích.

Rất nhiều nhà máy đơn lẻ được chế tạo như thế này.

6

Đây chỉ là hàm nhận được cho con trỏ của biến tĩnh. Không có gì bất hợp pháp về nó. Nó không thực sự nguy hiểm hơn bất kỳ loại dữ liệu tĩnh nào khác.

Nhưng dữ liệu tĩnh:

  1. tạo khớp nối chặt chẽ
  2. cản trở tái entrancy
  3. tạo cơ hội cho các lỗi vi tế
  4. thường là một dấu hiệu của sự thiết kế yếu
  5. nên được sử dụng rất khôn ngoan

Bộ nhớ tĩnh class modifier có nghĩa là bộ nhớ sẽ được dành riêng cho biến này cho vòng đời của quá trình.

+0

+1: câu trả lời duy nhất đề cập đến các vấn đề đa luồng (tái nhập) – smerlin

+0

+1: Nó không phải là bất hợp pháp, nhưng nó chết tiệt cũng nguy hiểm. – Puppy

-1

Giả sử bạn đã có nghĩa là int* static_nonew()

Khi bạn đã trở lại một con trỏ đến bất kỳ vị trí bộ nhớ, sau đó bộ nhớ có thể được ghi đè, không có bảo đảm bảo vệ trong C.

Ngoài ra, nếu bạn vượt qua con trỏ này đến free, hành vi là không xác định, vì vậy đôi khi nó sẽ được OK, và đôi khi nó sẽ đổ lõi.

Mặt khác, đây là mã hoàn toàn hợp pháp. Ngoài ra, hãy thay thế int thành một số struct mà bạn cần khởi tạo một lần và đó là một thành ngữ khá hữu ích.

+0

"Đôi khi nó sẽ được OK" là rất gây hiểu lầm. Ngay cả khi nó ** có vẻ ** okay thì có khả năng là lỗi bộ nhớ nguy hiểm. –

+0

@R .. Bạn có thể đọc toàn bộ câu không? Tôi nghĩ nếu nó nói lõi-dump nó ngụ ý rằng nó nguy hiểm. Và, bởi vì hành vi được xác định, đôi khi nó sẽ thực sự không có tác dụng phụ. –

1

Đó là hợp pháp nhưng hãy nhớ rằng bạn sẽ chỉ có một phiên bản chuyển tiếp và nó sẽ được xây dựng trước khi bạn chính() vì nó được khai báo là tĩnh. Nó khá giống với việc có một biến toàn cục.

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