【发布时间】:2012-02-03 16:57:40
【问题描述】:
从代码开始:
#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++,上面的 sn-p 代码让我很困惑。在 func1 中 addr4 和 addr6 的分配是堆栈分配(对吗?)。当 func1 存在时,它们应该消失(-ish,内存将保存该值,直到其他东西使用它)。这原本让我觉得我走的 ip2int 地图会打印垃圾。但是我从来没有能够做到这一点。
由于我还是 C++ 新手,我不排除我遗漏了什么。副本是否发生在我不知道的地方?我认为这对和地图插入调用都只是在引用。这应该意味着他们可以在某个时候引用垃圾。
好了,废话不多说。上面的代码是否有效,还是我只是走运而没有其他东西可以使用存储 addr4 和 addr6 的内存?
提前感谢您的任何帮助
【问题讨论】:
-
我不知道 boost,但是检查某些东西是否分配了堆栈或堆的一种简单方法是使用调试器并放置断点(例如在构造函数上)。你可能有一个堆栈分配的数据,但内部字段是堆分配的......
-
@BasileStarynkevitch 您无法判断通过检查构造函数创建的堆或堆栈是否在两种情况下都调用了相同的构造函数。
-
我的意思是在构造函数中放置一个断点,在运行时,在
gdb调试器下...。然后,如果到达构造函数,调试器将能够显示它的this隐式参数,您将知道该指针是在堆栈上还是在堆上。
标签: c++ boost memory-management