开始与代码:C++是堆栈还是堆分配?
#include <iostream>
#include <string>
#include <map>
#include <boost/asio.hpp>
typedef std::map<boost::asio::ip::address, int> Ip2Int;
Ip2Int ip2int;
void
func1()
{
boost::asio::ip::address addr4 = boost::asio::ip::address::from_string("192.168.2.1");
boost::asio::ip::address addr6 = boost::asio::ip::address::from_string("de::ad");
ip2int.insert(std::pair<boost::asio::ip::address, int>(addr4, 1));
ip2int.insert(std::pair<boost::asio::ip::address, int>(addr6, 2));
}
int
main()
{
func1();
Ip2Int::iterator iter = ip2int.begin();
do {
std::cout << iter->first << " -> " << iter->second << std::endl;
} while (++iter != ip2int.end());
return 0;
}
我学习C++和上面的代码片段中我迷惑。在func1中,addr4和addr6的分配是堆栈分配(对吧?)。当func1存在时,它们应该消失(-ish,内存将保存该值,直到其他人使用它)。这原本让我觉得我对ip2int地图的散步可能会打印垃圾。尽管如此,我仍然无法做到这一点。
因为我还是新来的C++,我不排除我错过了一些东西。一个副本是否发生在我不知道的地方?我以为这对和地图插入调用都只是引用。这意味着他们可以在某个时候引用垃圾。
好吧,足够散漫。上面的代码是否有效,或者我是幸运的,没有其他东西可以用来存储addr4和addr6的内存?
在此先感谢任何和所有帮助
我不知道增强,但一个简单的方法来检查是否堆栈或堆分配是使用调试器和放置断点(例如对构造函数)。你可能有一个堆栈分配的数据,但内部字段是堆分配的...... – 2012-02-03 17:00:13
@BasileStarynkevitch你不能告诉它的堆或栈通过检查构造函数创建相同的构造函数在两种情况下都被调用。 – rerun 2012-02-03 17:06:58
我的意思是在构造函数中,在运行时,在'gdb'调试器下面放置一个断点....然后,如果到达构造函数,调试器将能够显示其'this'隐式参数,如果该指针位于堆栈或堆上,则会有线索。 – 2012-02-03 17:19:31