C ++ это выделение стека или кучи? - PullRequest
1 голос
/ 03 февраля 2012

Начните с кода:

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

спасибо заранее за любую помощь

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

Да, копия создается при выполнении ip2int.insert <..> (..).

2 голосов
/ 03 февраля 2012

Этот код действителен. Когда вы вставляете пару адрес / int в карту, вы фактически делаете копию объекта адреса. Таким образом, объект локального адреса стека с именем «addr4» больше не существует, но его копия (принадлежит карте) существует. Это та копия, к которой вы обращаетесь, когда функция возвращается.

1 голос
/ 03 февраля 2012

Вставка в std::map делает копию объекта. Исходные объекты, addr4 и addr6, имеют автоматическую продолжительность хранения и уничтожаются в конце func1, но их копии счастливо живут в ip2int (что имеет статическую продолжительность хранения) и, таким образом, гарантированно будут действительны в течение выполнение программы.

0 голосов
/ 03 февраля 2012

Stl требует, чтобы объект, использующий свой контейнер, одним из которых является карта, является копируемым.Итак, все, что происходит, это то, что ip2int является автоматическим в глобальном масштабе и существует на протяжении всей жизни программы.В Func1 вы создаете две автоматики и копируете их на карту.В основе карты используется выделение кучи для хранения значений.Когда func1 существует, память из автоматики очищается и там вызываются деструкторы, но карта все еще существует, а созданные копии все еще существуют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...