2009-02-06 31 views
10

Khi bạn tạo một ứng dụng MFC mới, trình hướng dẫn tạo ra khối mã sau đây trong hầu hết các tập tin CPP:Có phải "#define mới DEBUG_NEW" và "#undef THIS_FILE" vv thực sự cần thiết không?

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

và đôi khi nó cũng cho biết thêm điều này:

#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 

Tôi muốn loại bỏ mã này từ các tệp CPP của tôi nếu nó là thừa. Tôi đang sử dụng một ứng dụng MFC với C + +/CLI trên VS2008.

Tôi đã thử chạy trong Debug sau khi xóa mã này khỏi CPP và có vẻ như hoạt động tốt. Các biến "mới" hoạt động tốt, không có rò rỉ và các hộp thoại ASSERT hiển thị tên tệp chính xác và chuyển đến dòng vi phạm.

Bất kỳ ai cũng có thể cho tôi biết nó có tác dụng gì không và có an toàn để xóa không?

Trả lời

10

Hoàn toàn an toàn để xóa điều này. Đó là một trợ giúp gỡ lỗi; để nó trong sẽ tạo ra cảnh báo trong cửa sổ đầu ra của bất kỳ rò rỉ bộ nhớ bạn có khi chương trình thoát.

+0

Bạn có chắc chắn không? VS2008 vẫn hiển thị một đối tượng rò rỉ bộ nhớ bị rò rỉ sau khi tôi đã xóa khối mã. Có lẽ đây là trường hợp trong VC6 hay gì đó ...? – demoncodemonkey

+1

Xin lỗi tôi vừa nhận ra có sự tinh tế với những gì bạn nói - khi mã ở đó cửa sổ đầu ra hiển thị tên tệp và dòng chứa rò rỉ bộ nhớ, trái ngược với việc chỉ ra rằng có rò rỉ bộ nhớ. – demoncodemonkey

+0

Vì vậy, giải thích phần đầu tiên của mã được tạo. Còn phần 2 thì sao? #undef THIS_FILE static char THIS_FILE [] = __FILE__; – demoncodemonkey

1

Trên Microsoft Visual C++ 2010, tôi có thể xóa toàn bộ mã và chỉ đặt # DENUG NEW DENUG_NEW trong tiêu đề và tôi vẫn nhận được báo cáo rò rỉ bộ nhớ phù hợp, ví dụ:

Detected memory leaks! 
Dumping objects -> 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {7508} normal block at 0x029B9598, 54 bytes long. 
Data: <    > E4 B8 C9 00 12 00 00 00 12 00 00 00 01 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {7501} normal block at 0x029B94A8, 28 bytes long. 
Data: <    > E4 B8 C9 00 05 00 00 00 05 00 00 00 01 00 00 00 
f:\source\agent\agent\deviceid.cpp(21) : {7500} normal block at 0x029CDFC0, 8 bytes long. 
Data: <  > A8 95 9B 02 B8 94 9B 02 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {6786} normal block at 0x029C0D88, 160 bytes long. 
Data: <  G  > E4 B8 C9 00 19 00 00 00 47 00 00 00 01 00 00 00 
f:\source\agent\sysinfo\sysinfo.cpp(27) : {6733} normal block at 0x029B84D8, 92 bytes long. 
Data: <    > 00 00 00 00 00 10 00 00 00 00 01 00 FF FF FE 7F 
Object dump complete. 
+3

Không, bạn không nhận được toàn bộ thông tin. Lưu ý cách mã bạn hiển thị chỉ hiển thị rò rỉ trong 'strcore.cpp' cho biết rằng bạn đã rò rỉ một đối tượng CString (hoặc somesuch). Với giá trị bù trừ DEBUG_NEW/THIS_FILE chính xác, nó cũng sẽ báo cáo vị trí trong * mã * của bạn nơi bạn đã thực hiện 'mới' –

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