从代码开始:

#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/

10-11 18:43