从代码开始:
#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++的新手,所以我不排除缺少某些东西。副本会出现在我不知道的地方吗?我认为这对和 map 插入调用都只是引用。这应该意味着他们可以在某个时候引用垃圾。
好的,足够的杂乱无章。上面的代码以某种方式有效吗?还是我很幸运,没有其他东西可以使用存储addr4和addr6的内存了?
在此先感谢您提供的所有帮助
最佳答案
是的,在执行ip2int.insert (..)时会创建一个副本。
关于c++ - C++是堆栈还是堆分配?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9132378/