C++ 每个函数的跟踪内存分配

C++ 每个函数的跟踪内存分配,c++,c,profiling,C++,C,Profiling,所以我知道我可以通过重载全局新内存的方法来跟踪内存分配,如下所示: 然而,我想知道是否有一个很好的方法来完成每个函数,这样我就可以得到一个关于每个函数分配了多少的报告。现在,我可以在我提供的链接中获取文件和行以及typeid,但我想找到分配最多的函数。如何执行以下操作: 你在用什么平台?可能存在特定于平台的解决方案,而无需更改代码库中的函数 如果您使用的是Microsoft Visual Studio,则可以使用编译器开关/Gh和/Gh让编译器调用您可以定义的函数\u penter和\u pex

所以我知道我可以通过重载全局新内存的方法来跟踪内存分配,如下所示:


然而,我想知道是否有一个很好的方法来完成每个函数,这样我就可以得到一个关于每个函数分配了多少的报告。现在,我可以在我提供的链接中获取文件和行以及typeid,但我想找到分配最多的函数。

如何执行以下操作:


你在用什么平台?可能存在特定于平台的解决方案,而无需更改代码库中的函数

如果您使用的是Microsoft Visual Studio,则可以使用编译器开关/Gh和/Gh让编译器调用您可以定义的函数
\u penter
\u pexit
。在这些函数中,您可以查询程序正在使用的内存量。应该有足够的信息来计算每个函数中分配了多少内存


本节提供了检查内存使用情况的示例代码。

可能是一个很好的内存分析工具提供了这一功能(不确定,如果valgrind允许的话)。我真的不想要像valgrind这样沉重的东西,因为在运行期间计时信息是无用的是,找一些基于代码注入的分析工具可能更好。@mockinterface您显然没有读到我链接的内容,或者我理解的问题我可以重载new,但我想要每个函数的粒度,而且似乎没有一个好方法为什么不使用valgrind?嗯,这很有趣,但是如果您运行FuncTwo()很多时候,你可以看到它并没有像在这种情况下那样以一个常量值增长,因为没有任何变化,所以它看起来不准确。也是
\uuuuu func\uuuuuuu
标准吗?这也要求用户手动添加全局alloc make pair的内容我希望能够自动完成。。我试图让它自动复位并在析构函数中打印,但由于某种原因它搞砸了。。这可能是我能想到的最好的了。。除此之外,您可能需要下载一个内存分析器。没有任何真正的方法可以自动将其包含在所有函数中,是吗?我这样说的原因是,如果我全局替换新函数,我可以选择在任何时候通过删除新函数的重载来删除它,或者在需要时将其重新添加。有了这个,总有一个对象包括占用内存。我需要一些跨平台的东西
#include <iostream>
#include <cstring>

class MemTracker
{
    private:
        static char func_name[100];
        static size_t current_size;

    public:
        MemTracker(const char* FuncName) {strcpy(&func_name[0], FuncName);}
        static void inc(size_t amount) {current_size += amount;}
        static void print() {std::cout<<func_name<<" allocated: "<<current_size<<" bytes.\n";}
        static void reset() {current_size = 0; memset(&func_name[0], 0, sizeof(func_name)/sizeof(char));}
};

char MemTracker::func_name[100] = {0};
size_t MemTracker::current_size = 0;


void* operator new(size_t size)
{
    MemTracker::inc(size);
    return malloc(size);
}

void operator delete(void* ptr)
{
    free(ptr);
}


void FuncOne()
{
    MemTracker(__func__);

    int* i = new int[100];
    delete[] i;
    i = new int[200];
    delete[] i;

    MemTracker::print();
    MemTracker::reset();
}

void FuncTwo()
{
    MemTracker(__func__);
    char* c = new char[1024];
    delete[] c;
    c = new char[2048];
    delete[] c;

    MemTracker::print();
    MemTracker::reset();
}

int main()
{
    FuncOne();
    FuncTwo();
    FuncTwo();
    FuncTwo();
    return 0;
}
FuncOne allocated: 1200 bytes.
FuncTwo allocated: 3072 bytes.
FuncTwo allocated: 3072 bytes.
FuncTwo allocated: 3072 bytes.