如果我能做到,请告诉我?
我正在编写一个可以在C ++中跟踪内存分配和解除分配的库。简而言之,我试图看看我的应用程序是否没有任何内存泄漏。这就是我到目前为止所做的。
立即覆盖new和delete运算符。每当应用程序使用new时,我计划存储该调用中分配的地址和字节数。同样,当在该地址上调用delete时,我将从存储的列表中删除它。直到现在它的罚款。但我想存储文件名和调用“new”的行号。我只能在被覆盖的新事物中做到这一点。有没有办法在重写函数中获取行号?
1 int main()
2 {
3 // Say, A is a structure
4 A *a = new A();
5 return 0;
6 }
7 void* operator new( size )
8 {
9 //
10 // store the line number and file name on line 4 ??? Can I do it?
11 return (malloc(size));
12 }
------------------------
答案 0 :(得分:3)
宏__LINE__
给出行号
而且__FUNCTION__
和__FILE__
真的很有帮助,给出了封闭函数的const char *和文件名。编辑:(__FUNCTION__
不是标准的,但有几个编译器支持)
但遗憾的是这些宏只能取得它们的价值。
所以你不可能要求来电者。
您应该在使用__LINE__
的任何地方编写__FILE__
和new
个宏。 :(
或者......你可以访问一堆来电者,但我不知道有什么常见的方法可以做到这一点......而且我已经搜索了很长时间,以至于认为不可能在调试模式下。
答案 1 :(得分:1)
最后,我在这个论坛中得到了一个类似线程的答案...以下代码有效...让我们说,
class A
{
public:
char str[1000];
A()
{
strcpy(str,"Default string");
}
A(const char* s)
{
strcpy(str,s);
}
};
void * operator new (unsigned size, char const * file, int line)
{
cout << "File = " << file << endl;
cout << "Line = " << line << endl;
return( malloc(size));
}
#define new new(__FILE__, __LINE__)
int main()
{
A *a = new A("Leak");
printf("%s",a->str);
delete a;
return 0;
}
我发现答案的相关帖子...... overloading new and delete in c++
答案 2 :(得分:0)
您可以使用工作室dbx运行时检查功能来识别Solaris(http://blogs.oracle.com/janitor/entry/runtime_memory_checking)下的内存泄漏。)libumem也非常有用(http://blogs.oracle.com/pnayak/entry/finding_memory_leaks_within_solaris。)