вставка «этого» в карту STL из конструктора - PullRequest
0 голосов
/ 08 сентября 2010

ВЕРСИЯ 1

class Doh {
private:
    static std::map<const std::string, const Doh*> someMap;
    std::string stringValue_;
public:
    Doh(std::string str) : stringValue_(str) {
        Doh::someMap.insert(
            std::make_pair<const std::string,const Doh*>
                (this->stringValue_,this)
        );
    }
}

С MSVC 2010 выше было все в порядке, но с MSVC 2008 он не работает - и я думаю, это потому, что объект еще не создан, когда он вставлен в карту (я получил нарушение доступа к памяти).

Итак, я попытался отложенная вставка , которая сработала:

ВЕРСИЯ 2

Doh(std::string str) : stringValue_(str) {
    boost::thread(&Doh::insertIntoTheStaticMap,this);
}
void insertIntoTheStaticMap() {
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
    Doh::someMap.insert(
        std::make_pair<const std::string,const Doh*>
            (this->stringValue_,this)
    );
}
Но, как вы можете догадаться, я намерен использовать static Doh :: someMap в качестве общего поискового словаря.

ВЕРСИИ 1 не требовалось никакой безопасности потока, потому что я бы создал все экземпляры Doh в одном и том же потоке - в блоках инициализации - которые будут вызываться динамическими инициализаторами до того, как я введу main ().

Но в VERSION 2 наивный сон () не является ни грациозным, ни надежным (не говоря уже о том, что перед вставкой мне может понадобиться заблокировать карту).

Каким будет хороший подход поцелуя?

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Единственная потенциальная проблема, которую я вижу, это инициализация члена static, если имеется несколько исходных файлов.Попробуйте защитить его с помощью функции.

class Doh {
private:
    static std::map< std::string, Doh * > &get_map() {
        static std::map< std::string, Doh * > someMap;
        return someMap; // initialize upon first use
    }
    std::string stringValue_;
public:
    Doh(std::string str) : stringValue_(str) {
        get_map().insert(
            std::make_pair
                (this->stringValue_,this)
        );
    }
};
0 голосов
/ 08 сентября 2010

Ни в одной версии нет никаких признаков инициализации для stringvalue_ - что отладчик показывает вам об этом ключе, когда вы нажимаете вставку карты в версии 1 кода? Как настроено это поле и каков его тип?

Запуск этого в отладчике для VS2008 должен позволить вам сузить точку сбоя до источника <map>, я бы подумал.

...