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__
và __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.
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ù. –
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
@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