【问题标题】:inserting "this" into an STL map from the constructor从构造函数将“this”插入到 STL 映射中
【发布时间】:2010-09-08 18:36:43
【问题描述】:

版本 1

类多{ 私人的: 静态 std::map someMap; std::string stringValue_; 上市: Doh(std::string str) : stringValue_(str) { Doh::someMap.insert( std::make_pair (this->stringValue_,this) ); } }

以上在 MSVC 2010 上是可以的,但在 MSVC 2008 上它失败了——我猜这是因为对象在插入映射时尚未构造(我遇到了内存访问冲突)。

所以,我尝试了延迟插入,它奏效了:

第 2 版

Doh(std::string str) : stringValue_(str) { boost::thread(&Doh::insertIntoTheStaticMap,this); } 无效 insertIntoTheStaticMap() { boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); Doh::someMap.insert( std::make_pair (this->stringValue_,this) ); } 但正如您可能猜到的那样,我的意图是将 static Doh::someMap 作为通用查找字典。

版本 1 不需要任何线程安全,因为我会在同一个线程中创建所有 Doh 实例——在初始化块中——在我进入 main() 之前,动态初始化器会调用这些实例。

但是对于版本 2,天真的 sleep() 既不优雅也不可靠(更不用说,我可能需要在插入之前锁定地图)。

什么是不错的 KISS 方法?

【问题讨论】:

  • 也许您可以为版本一显示更多代码。这不应该有什么问题。地图的类型是什么? this->stringValue_ 的类型是什么?你还用什么地图?
  • 匆忙中我删除了更多我应该删除的代码......我已经编辑了帖子。感谢您的快速周转
  • 仍然缺少map 参数。

标签: visual-c++ stl constructor insert map


【解决方案1】:

如果有多个源文件,我看到的唯一潜在问题是 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)
        );
    }
};

【讨论】:

  • 那行得通——我认为静态初始化器总是先于动态初始化器。
【解决方案2】:

在这两个版本中,stringvalue_ 都没有任何 init 迹象 - 当您在代码的版本 1 中点击地图插入时,调试器会向您显示什么有关此键的信息?这个字段是如何设置的,它的类型是什么?

在 VS2008 的调试器中运行它应该可以让您将故障点缩小到 &lt;map&gt; 源,我原以为。

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多