1

これが明らかである場合はお詫び申し上げます。過去 1 時間、これについて頭を悩ませていたので、最小限の例を提供しようと思います。これは簡単なことだと確信しています。

私は次のものを持っています:

class Table { /* implementation superfluous */ };
typedef boost::shared_ptr<Table> TablePtr;

後で、データベース クラスで:

class Database{
    typedef std::map<std::wstring, TablePtr> table_map_type;
    table_map_type tableCache_;
};

そして、テーブルを取得する演算子を定義します。

TablePtr Database::operator[](const std::wstring& name) {
    table_map_type::iterator it(tableCache_.find(name));
    if(it != tableCache_.end())
        return it->second;

    // not found, create
    TablePtr ret(new Table());
    tableCache_[name] = ret;
    return ret;
};

今起こっていることは、これに対する私の最初の呼び出しでは問題ありません。指定されたテーブル名で何も見つからず、作成されてマップに配置され、共有ポインター内に返されます。

この問題は、後で同じインスタンスに戻って同じ名前を探すときに発生します。それを正しく見つけて、 に戻りますreturn it->second。ただし、そのオブジェクトの次の即時の呼び出しは、作成されたものではないオブジェクトで悪魔と鼻に飛び込みます。

明らかな何かが欠けていると確信しています。前もって感謝します。

編集

私の最小限のコード例が機能したので、さらに深く掘り下げる必要があります。最初の挿入でさえ正しく動作しないようです。operator[]上記の関数内で、TablePtr構築された はその中に有効なテーブル オブジェクトを保持します (内部名が として表示されるためL"_contract"です。簡単なテスト行を実行しました。

db::TablePtr first((*db)[L"_contract"]);

その関数内では、テーブル名は_contract. firstデバッガで調べると、 のテーブル名が表示されL""ます。どこかで何かがおかしくなっている。実際のクラスの外でそれを再現するためのコードをさらに取得しようとしています。

4

1 に答える 1

1

コメントをくださった皆様、大変申し訳ありませんでした。いつものように、画面を長時間見つめているとどうなりますか (休憩時間ですか?)。テーブル名への参照をコピーするのではなく、テーブル内に保存していたことがわかりました。これは、(L"_contract") がスコープ外 (シーケンス外?) になると、事実上死んでしまうことを意味していました。したがって、後者の問題が発生します。

困惑した質問を見てくれたすべての人に感謝します。

于 2013-03-02T14:56:17.123 に答える