考虑下面的C++程序:
#include <cstdlib> // for exit(3)
#include <string>
#include <iostream>
using namespace std;
void die()
{
exit(0);
}
int main()
{
string s("Hello, World!");
cout << s << endl;
die();
}
在valgrind中运行这个代码,输出结果如下(为了简洁省略了部分内容):
==1643== HEAP SUMMARY:
==1643== in use at exit: 26 bytes in 1 blocks
==1643== total heap usage: 1 allocs, 0 frees, 26 bytes allocated
==1643==
==1643== LEAK SUMMARY:
==1643== definitely lost: 0 bytes in 0 blocks
==1643== indirectly lost: 0 bytes in 0 blocks
==1643== possibly lost: 26 bytes in 1 blocks
==1643== still reachable: 0 bytes in 0 blocks
==1643== suppressed: 0 bytes in 0 blocks
如您所见,有一个可能丢失了堆上的26个字节。我知道std :: string
类有一个12字节的结构体(至少在我的32位x86架构和GNU编译器4.2.4上),加上一个以空终止符结束的“Hello, World!”一共是14个字节。如果我理解正确,这个12字节的结构包含一个指向字符串的指针,已分配的大小和引用计数(如果我在这里错了,请纠正我)。
现在我的问题是:C ++字符串在栈/堆中如何存储?当声明时,是否存在std :: string
的堆栈对象(或其他STL容器)?
P.S. 我曾在某处读到过,valgrind在使用STL容器(以及“几乎容器”例如std :: string
)的某些C ++程序中可能会报告内存泄漏的虚假阳性。我不太担心这个泄漏,但它确实引起了我对STL容器和内存管理的好奇。
die()
函数,以将exit(0)
调用与main()
分离。现在,我的程序必须将控制权转移到被调用的函数中,在该函数中,exit(0)
函数会“拔掉”此程序的执行。请记住,这个程序除了学术目的外没有任何有用的目的。 - pr1268