0

順序付けられていないマップ (ハッシュ マップ) を共有しようとしていますが、マップにデータを挿入しようとする行で浮動小数点例外が発生します。

誰かが私が間違っている場所を理解するのを手伝ってもらえますか?

#include <iostream>
#include <string>
#include <unordered_map>

#include <sys/ipc.h>
#include <sys/shm.h>
int main ()
{
    std::unordered_map<std::string,double> *tmp;

    key_t key = 5678;
    int shmid = shmget(key, 1000, IPC_CREAT | IPC_EXCL | 644);
    if(shmid == -1){
        std::cerr << "Failed to create the shared segment." << std::endl;
        exit(-1);
    }

    void *addr = shmat(shmid, NULL, 0);
    if(addr == (void*)-1){
        std::cerr << "Failed to attach the segment to the process." << std::endl;
        exit(-1);
    }

    tmp = static_cast< std::unordered_map<std::string,double>* >(addr);
    tmp->insert (std::pair<std::string,double>("abc",1.2));

    shmdt(addr);
    return 0;
}

ありがとう。

4

2 に答える 2

6

一般に、プロセス間で複雑な構造を共有することはできません。特に、あるプロセスの仮想アドレス空間内のオブジェクトへのポインターは、別のプロセスでは有効ではなく、ほとんどのコンテナー実装にはポインターが含まれます。

共有に適したさまざまなコンテナとアロケータを含むBoost.Interprocessライブラリを見ることができます。特に、それらのバージョンは、共有メモリアロケータを使用している限りunordered_map 、共有メモリに配置できるため、代わりに使用できる可能性があります(ただし、キーとしてのstd::unordered_map代わりが必要です)。 std::string

于 2012-08-01T14:40:54.250 に答える
1

共有メモリアドレスをマップへのポインターにキャストしていますが、コンストラクターを呼び出して実際にそのアドレスにマップを作成することはありません。いずれにせよ、マップは、共有メモリ領域からではなく、ヒープから取得される独自の使用のためにメモリを割り当ておよび割り当て解除する可能性があるため、これはおそらくあなたが望むようには機能しません。

于 2012-08-01T14:44:10.597 に答える