2016-01-03 79 views
0

我想在共享內存中創建字符串。我有簡單的程序I C++:共享內存POSIX將字符串值存入

#include<iostream> 
#include<string> 
#include<stdlib.h> 
#include<semaphore.h> 
#include<stdio.h> 
#include<sys/shm.h> 

int main(void){ 
    std::string* line; 
    key_t lineKey = ftok("/tmp", '1'); 
    int sharedLine = shmget(lineKey, sizeof(std::string), IPC_CREAT | 0660); 
    line = (std::string*)shmat(sharedLine, NULL, 0); 

    std::string helpVar = ""; 
    while (true) { 
     std::cin >> helpVar; 
     (*line) = helpVar; 
    } 

    return 0; 
} 

但是,當我執行它(執行g++ -o myprogram myprogram.cpp -lpthread編譯時確定),寫的東西,它說Core dumped。我錯了什麼?

回答

2

您只需分配內存。這是不夠的。首先,你需要構造一個字符串對象。您可以使用位置newoperator用於此目的,如:

line = new(shmat(sharedLine, NULL, 0)) std::string(); 

不過,這不會解決你的問題,如果你想實際內容的字符串是在共享內存。處理該問題的一種方法是爲將使用共享內存池的std::basic_string類定義自定義分配器。另一方面,這將會太麻煩,並且以這種方式創建的字符串對象與標準std::string相比將是不同的類型。

因此,最好只使用純舊的C零結尾的字符串:

#define MAX_SIZE 100 

int main(void){ 
    key_t lineKey = ftok("/tmp", '2'); 
    int sharedLine = shmget(lineKey, MAX_SIZE, IPC_CREAT | 0660); 
    char *line = (char *)shmat(sharedLine, NULL, 0); 

    std::string helpVar; 
    while (true) { 
     std::cin >> helpVar; 
     strncpy(line, helpVar.c_str(), MAX_SIZE - 1); 
    } 

    return 0; 
} 
+0

呵呵謝謝你,我很牛逼在這一點,我做這個愚蠢的錯誤:( – ventaquil

+0

那是去上班的字符串?不是一個基本的對象,它有自己的分配,不會在共享內存中更好地堅持簡單的整數(包括字符數組) –

+0

好吧,將更新答案@LightnessRacesinOrbit – kfx