2012-10-10 24 views
6

Thư viện thời gian chạy của Microsoft cung cấp phiên bản gỡ lỗi của chức năng phân bổ. Đối với C++ đây là một biến thể gỡ lỗi của nhà điều hành mới với chữ ký:Ghi đè mới bằng phiên bản gỡ lỗi mà không làm hỏng vị trí mới

void *operator new(size_t size, int blockType, const char *filename, int linenumber); 

và macro được định nghĩa như

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 

Bây giờ để công cụ tất cả phân bổ, người ta thường định nghĩa

#if defined DEBUG_NEW 
#define new DEBUG_NEW 
#endif 

Tuy nhiên, định nghĩa này phá vỡ bất kỳ vị trí nào sử dụng vị trí mới, bởi vì hai bộ đối số kết thúc là lỗi cú pháp. Bây giờ tôi có thể dễ dàng xử lý một số cách sử dụng trong mã của chúng tôi, nhưng thư viện chuẩn và tăng cường việc sử dụng vị trí mới trên khắp nơi. Vì vậy, việc xác định phương tiện toàn cầu này bao gồm rất nhiều thứ trước khi định nghĩa và làm chậm quá trình biên dịch. Vì vậy, sẽ có bất kỳ cách nào để phân bổ công cụ trong mã của chúng tôi mà không cần kéo vào tiêu đề chỉ vì chúng chứa vị trí mới và không phải đặt định nghĩa cuối cùng ở trên trong tất cả các tệp hoặc viết DEBUG_NEW theo cách thủ công?

Trả lời

0

điều này cả DEBUG_NEW nên chết trong lửa! Nó hầu như không bao giờ hữu ích và nó không hữu ích trong C++ hiện đại, bởi vì bạn không còn thấy new trong sane C++.

Có các tùy chọn tốt hơn như DUMA và bây giờ có Dr. Memory (hoạt động tương tự như Valgrind, nhưng trên Windows), hoàn toàn không có điểm khi sử dụng DEBUG_NEW abomination.

3

Con đường tôi đã giải quyết này trong lịch sử là bằng cách sử dụng tiêu đề biên dịch sẵn, và làm một cái gì đó như thế này (StdAfx.h, Pch.h, PreCompiled.h hoặc bất kỳ):

//First include all headers using placement new 
#include <boost/tuple/tuple.hpp> 
#include <vector> 

#define new MY_NEW 
#define MY_NEW new(__FILE__, __LINE__) 

Và sau đó đảm bảo không có tệp nào bao gồm tiêu đề tăng trực tiếp nhưng chỉ có tiêu đề được biên dịch trước.

+0

Các tiêu đề được biên dịch trước sẽ thực sự là nỗi đau để duy trì trong tình huống của chúng tôi. Họ sẽ thực sự rất lớn và phức tạp do các vấn đề về tính di động khác nhau (codebase được biên dịch cho 4 nền tảng rất khác nhau). –

+0

Theo cách nào thì khó có thể duy trì? Các pch nên thay đổi rất thường xuyên. –

+0

Nếu nó bao gồm các công cụ tăng, nó sẽ thay đổi khá thường xuyên. Nhưng có lẽ tôi nên thử biên dịch trước chỉ tiêu đề gỡ lỗi bộ nhớ này (được tiêm với tùy chọn trình biên dịch '/ Fi'); vị trí mới xuất hiện ở những nơi ít hơn đáng kể. –

-1

define new DEBUG_NEW dòng phải được đặt trong tệp nguồn, sau tất cả #bao gồm các dòng. Bằng cách này, nó chỉ được áp dụng cho mã của riêng bạn và không được áp dụng cho bất kỳ tệp h nào khác như Boost. Toàn cầu mới để DEBUG_NEW redifinition có thể gây ra biên dịch thất bại và nên tránh.

+0

Bạn nói đúng, ngoại trừ, bạn thấy đấy, câu hỏi rõ ràng là ** KHÔNG LÀM R THNG **. –

+0

Ví dụ tốt về biểu quyết mà không đọc câu trả lời. –

5
#pragma push_macro("new") 
#undef new 

new(pointer) my_class_t(arg1, arg2); 

#pragma pop_macro("new") 

hoặc

#pragma push_macro("new") 
#undef new 

#include <...> 
#include <...> 
#include <...> 

#pragma pop_macro("new") 
+0

Sẽ hữu ích khi mô tả cách hoạt động của 'push_macro()' và 'pop_macro()'. Chẳng hạn như, bản gốc 'mới' được khôi phục sau' pop_macro ("mới") '. – cpburnz

0

Tôi biết đây là loại muộn, nhưng vấn đề có thể được giải quyết bằng cách sử dụng mẫu ma thuật.

Gần đây tôi đã mã hóa trình gỡ lỗi debug_new, bổ sung thêm từ khóa mới "vị trí", được viết trước mặt của tất cả các cuộc gọi mới.

Bạn có thể kiểm tra debugger của tôi ở đây: https://sourceforge.net/projects/debugnew/

Hoặc debugger debug_new từ nvwa đây: https://sourceforge.net/projects/nvwa/

+0

Bạn có thể bao gồm giải thích cách thức và lý do hoạt động không? –

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