我想在共享内存中创建字符串。我有简单的程序i C ++:
#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
。我错了什么?
答案 0 :(得分:2)
你只需分配内存。这还不够。首先,您需要构造一个字符串对象。您可以将展示位置new
operator用于此目的,如:
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;
}