2009-05-26 36 views
8

Đoạn mã sau có rò rỉ bộ nhớ mà tôi đã dành quá nhiều thời gian để theo dõi. Vấn đề là bên trong Foo(), biến cục bộ x_ ẩn biến thành viên x_. Nó khá khó chịu quá, bởi vì trình biên dịch có thể đã cảnh báo tôi về nó. Có một lá cờ trong GCC cho một cảnh báo như vậy không? (Đối với những người tò mò: Tôi đã đến mã lỗi bằng cách sử dụng biến cục bộ đầu tiên, sau đó thay đổi thành biến thành viên, nhưng quên loại bỏ khai báo kiểu.)Cảnh báo về ẩn biến thành viên?

struct A { 
    A() x_(NULL) {} 

    ~A() { 
    delete x_; 
    } 

    void Foo() { 
    HugeThingy* x_ = new HugeThingy(); 
    x_->Bar("I. Need. Garbage. Collection. Now."); 
    } 

    HugeThingy* x_; 

    DISALLOW_COPY_AND_ASSIGN(A); // Macro to prevent copy/assign. 
} 
+1

Một số người đã đề cập rằng bạn chỉ nên sử dụng đối tượng chuỗi đơn giản thay vì con trỏ và phân bổ động - và chúng đúng. Nếu (như tôi nghi ngờ), bạn thực sự muốn biết làm thế nào để trình biên dịch cảnh báo bạn khi bạn khai báo biến cục bộ ẩn biến thành viên, tôi khuyên bạn nên làm rõ câu hỏi của mình. –

+3

Khi bạn có con trỏ làm biến thành viên, hãy nhớ cung cấp cho hàm tạo bản sao và toán tử gán. –

+2

Nếu không cung cấp cho chúng, thì ít nhất hãy loại bỏ các giá trị mặc định. –

Trả lời

24

Use -Wshadow.

Nhân tiện, cả -W lẫn -Wall đều bật -Wshadow. Nó là tốt đẹp để có trình biên dịch giúp tránh loại vấn đề, nhưng điều đó thậm chí sẽ không cần thiết nếu bạn sử dụng quy ước giúp tránh tạo ra nó ở nơi đầu tiên, như đặt tên của mẫu x_ cho biến thành viên, không phải biến cục bộ.

+2

+1. Bạn * thậm chí * trả lời câu hỏi thực tế đang được hỏi! –

+0

Dường như với tôi rằng OP có một quy ước như vậy, nhưng đã có một "suy nghĩ" và gõ "string * x_ =" thay vì "x_ =" đã được dự định thực sự. –

+2

IMHO, tốt hơn hết là để trình chỉnh sửa của bạn làm nổi bật các biến cục bộ và thành viên theo cách tương phản hơn là thêm dấu gạch ngang vào tên. – rmeador

5

FWIW Tôi sẽ không gặp vấn đề này vì tôi sử dụng quy ước đặt tên để phân biệt dữ liệu thành viên với biến cục bộ: số nhận dạng dữ liệu thành viên của tôi luôn được đặt trước là m_.

+1

+1, quy ước rất phổ biến. –

+0

Nó cũng không phải là quy ước không phổ biến đối với các chức năng thành viên riêng. Nó giúp để nắm bắt nhanh chóng và rõ ràng trong một giây riêng tư. – mloskot

+1

Và không ai làm việc trên mã đã từng thực hiện một lỗi sao chép và dán? Wow. – danio

0

Chúng tôi sử dụng những mụn cóc trên sự khởi đầu của tên - A_ luận D_ thành viên dữ liệu dữ liệu tĩnh s_ trong dữ liệu tĩnh lớp f_ trong tập tin

... và không có mụn cóc cho các biến địa phương.

Thật vậy, sách Lakos là bạn của bạn.

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