我编写了以下代码,以便对Valgrind有一个基本的了解,并且很难解释它的输出。这可能与Valgrind无关,但更基本的C ++。
#include <string>
#include <iostream>
using namespace std;
class Valgrind_testclass
{
std::string * stringInHeap;
public:
Valgrind_testclass() {
stringInHeap = new std::string("String in heap");
}
~Valgrind_testclass() {
//delete stringInHeap;
}
void PrintFunc(void) {
cout << "Nothing but a printout" << endl;
}
};
int main()
{
Valgrind_testclass * valObjPtr = new Valgrind_testclass();
delete valObjPtr;
return 0;
}
Valgrind输出:
==4459== HEAP SUMMARY:
==4459== in use at exit: 31 bytes in 2 blocks
==4459== total heap usage: 3 allocs, 1 frees, 35 bytes allocated
==4459==
==4459== Searching for pointers to 2 not-freed blocks
==4459== Checked 102,100 bytes
==4459==
==4459== 31 (4 direct, 27 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2
==4459== at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==4459== by 0x80487DB: Valgrind_testclass::Valgrind_testclass() (in /home/madu/C++/ValgrindTest)
==4459== by 0x80486F6: main (in /home/madu/C++/ValgrindTest)
==4459==
==4459== LEAK SUMMARY:
==4459== definitely lost: 4 bytes in 1 blocks
==4459== indirectly lost: 27 bytes in 1 blocks
==4459== possibly lost: 0 bytes in 0 blocks
==4459== still reachable: 0 bytes in 0 blocks
==4459== suppressed: 0 bytes in 0 blocks
==4459==
==4459== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6)
有人可以告诉我在哪里进行3次分配吗?我只能看到两个分配。还有为什么它说“间接丢失”?
谢谢。
答案 0 :(得分:9)
构造std::string
对象时,它会分配另一个指针(对象内部)以指向字符串值。这是第三个分配的来源,也是间接泄露的内存。
换句话说,你有这三个分配:
new Valgrind_testclass()
(明确)new std::string("String in heap")
(明确)由于您泄漏了分配2,您也间接泄露了分配3;字符串的析构函数不会被调用,因此它没有机会免费分配3。
答案 1 :(得分:4)
您有3次分配,因为std::string
也会分配内存。
间接丢失,意味着你丢失了一个指向某个其他内存指针的指针。在这种情况下,您没有删除stringInHeap
,并且您丢失了它的指针。通过它,分配了内存的实际std::string
无法删除它,因此内存也会丢失。