2009-09-08 31 views
5

Tôi đang cố gắng viết một trình thu thập bộ nhớ và cho đến nay đã có thể nhận các chức năng tùy chỉnh của tôi để làm việc cho malloc, miễn phí, mới và xóa. Tôi đã thử sử dụng __FILE____LINE__ để ghi lại trình khởi tạo bên trong phương thức mới quá tải, nhưng (như mong đợi) nó chỉ cung cấp chi tiết về nơi hàm bị quá tải. Có cách nào để lấy chi tiết về người khởi tạo cho các hàm quá tải mà không thực hiện bất kỳ thay đổi nào đối với mã hiện có của thành phần đang được thử nghiệm (như #define cho malloc) không?Ghi đè dữ liệu "mới" và Ghi nhật ký về người gọi

Chức năng Tôi đang sử dụng là:

void* operator new (size_t size) 
{ 
    if(b_MemProfStarted) 
    { 
     b_MemProfStarted = false; 
     o_MemLogFile << "NEW: " << "| Caller: "<< __FILE__ << ":" 
       << __LINE__ << endl; 
     b_MemProfStarted = true; 
    } 

    void *p=malloc(size); 
    if (p==0) // did malloc succeed? 
    throw std::bad_alloc(); // ANSI/ISO compliant behavior 

    return p; 
} 

Các bool b_MemProfStarted được sử dụng để tránh các cuộc gọi đệ quy trên ofstream và map.insert.

Trả lời

3

Bạn có thể viết

new(foo, bar) MyClass; 

Trong trường hợp này các chức năng sau đây được gọi là

void*operator new(std::size_t, Foo, Bar){ 
    ... 
} 

Bây giờ bạn có thể gọi

new(__LINE__, __FILE__) MyClass; 

và sử dụng dữ liệu với

void*operator new(std::size_t, unsigned line, const char*file){ 
    ... 
} 

Thêm một macro

#define new new(__LINE__, __FILE__) 

vào mã được giám sát sẽ bắt hầu hết các lời gọi mà không cần thay đổi mã nguồn.

Không hoàn hảo vì bạn có thể gọi trực tiếp cho nhà điều hành mới. Trong trường hợp đó, bộ tiền xử lý sẽ biến mã của bạn thành rác. Tôi biết không có cách nào tốt hơn.

+0

Do 'new' là một từ khóa, cố gắng để tái xác định nó với một macro là hành vi không xác định (phần mở rộng trình biên dịch cụ thể ngoại trừ). Tôi muốn định nghĩa điều kiện một macro DEBUG_NEW_PLACEMENT cho 'bình thường' 'new' và để lại' toán tử mới' rõ ràng và vị trí đặc biệt 'mới' một mình. Nó vẫn không phải là một giải pháp khá, mặc dù. –

+0

void * toán tử new (std :: size_t, unsigned line, const char * file) sẽ thất bại vì "new" chỉ mất size_t. Không thể sử dụng "#define new new (__ LINE__, __FILE__)" và toán tử ghi đè lên nhau vì nó sẽ cố gắng thay thế "mới" trong định nghĩa hàm ghi đè. void * toán tử new (std :: size_t) -> void * toán tử mới (__ LINE__, __FILE __)/* đệ quy? */(Std :: size_t) – Gayan

+0

@Charles Bailey - Bạn có thể xây dựng? Tôi không quen với DEBUG_NEW_PLACEMENT Tôi đã thử "#define (kích thước) My_New mới (kích thước, __FILE__, __LINE__)" nhưng điều này dường như không được gọi khi thực hiện "mới" – Gayan

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