【发布时间】:2018-11-13 08:38:36
【问题描述】:
我正在酒店预订系统上编写一个程序,并声明了一个结构 Room,如下所示:
struct Room {
bool isavailable;
bool ispaid;
string customer;
string date;
};
我使用从输入文件中读取的变量来创建一个包含 n 个结构的数组,它是酒店中的所有房间。
struct Room* rooms = new Room[numOfRooms];
然后我创建共享内存空间并附加它,但是当我尝试访问它之后,它似乎不起作用。
//creates shared memory space
if((shmid = shmget(shmkey, 1000, IPC_CREAT | 0666)) < 0) {
perror("Failed to allocate shared mem");
exit(1);
}
//attaches shared memory to process
Room* shared_memory;
shared_memory = (Room* ) shmat(shmid, NULL, 0);
if(!shared_memory) {
perror("Error attaching");
exit(0);
}
struct Room *PTR = rooms; //temp pointer to rooms array
cout << "test: " << rooms[1].customer << endl; //print before storing in shared memory
rooms = (struct Room*) shared_memory+sizeof(int); //places rooms array in shared memory
delete [] PTR; //deletes the memory location where rooms was stored before being in shared memory
cout << "test: " << rooms[1].customer << endl; //print after storing in shared mem
如您所见,在将房间移动到共享内存之前,我有一个 cout 语句,它会打印正确的内容,但之后的 cout 是空的。任何帮助将不胜感激,谢谢。
【问题讨论】:
-
std::string对象在堆中动态分配它们的内存。字符串数据本身不会在共享内存中,只有指向内存的指针。使用任何类型的动态结构和数据对于共享内存(以及一般的 IPC)来说都是非常重要的。 -
您没有将
rooms数组移动到共享内存中。此外,在 C++ 中,无法在内存中移动对象(您可以复制它们的字节表示,但仅限于 trivially-copyable 类型,这不是您的情况,因为string成员变量) .您可以移动对象的内容,但这需要使用移动构造函数和放置新语法来构造它们(在未初始化的内存中)。即使这样,在长字符串的情况下,它们的字符仍将保留在(非共享)堆中。您将仅共享string对象本身,而不是存储的字符串。 -
@DanielLangr 那么如果我将字符串成员变量重写为字符呢?
-
@Bzm10823 如果您使用某个预定义大小的 char 数组,那么就可以了(例如
char customer[100];。如果您使用动态分配的 char 数组,那么您将遇到与std::string.
标签: c++ linux unix shared-memory