kimi:如何分析是哪个接口调用了最多次的operator new[]接口?

如何分析是哪个接口调用了最多次的operator new[]接口?
重载 operator new[]:你可以在你的程序中重载 operator new[],记录每次调用时的调用栈信息。

#include <iostream>
#include <fstream>
#include <new>
#include <cstdlib>
#include <execinfo.h> // 包含 backtrace 函数
#include <dlfcn.h>    // 包含 dladdr 函数,用于解析符号信息

// 重载 operator new[]
void* operator new[](std::size_t size) {
    void* ptr = malloc(size);
    if (ptr == nullptr) {
        throw std::bad_alloc();
    }

    // 获取调用栈信息
    void* buffer[10];
    int nptrs = backtrace(buffer, 10);
    char** symbols = backtrace_symbols(buffer, nptrs);

    // 打开文件流
    std::ofstream logFile("allocations.log", std::ios::app); // 以追加模式打开
    if (!logFile) {
        std::cerr << "Failed to open allocations.log" << std::endl;
        free(symbols);
        return ptr;
    }

    // 写入调用栈信息到文件
    logFile << "Allocated " << size << " bytes at " << ptr << std::endl;
    for (int i = 0; i < nptrs; i++) {
        logFile << symbols[i] << std::endl;
    }

    // 关闭符号表
    free(symbols);
    // 关闭文件流
    logFile.close();

    return ptr;
}

// 重载 operator delete[]
void operator delete[](void* ptr) noexcept {
    free(ptr);
}

int main() {
    int* arr = new int[10];
    delete[] arr;
    return 0;
}
posted @ 2024-09-02 18:46  joel-q  阅读(3)  评论(0编辑  收藏  举报