std::string
멤버가 들어있는 구조체에 대한 포인터를 msgrcv
으로 전달할 수 없습니다. 이는 인터페이스 계약에 위배됩니다.크기 msgrcv
에 세번째 파라미터이고 msgrcv
필요에 전달
두번째 파라미터 struct { long mtype; char mdata[size]; };
형태의 '보통'C 구조체를 저장하기에 충분한 공간이 버퍼 가리.
불행하게도이 버퍼의 크기를 결정하는 데는 size
이 포함될 수 있지만 이러한 종류의 인터페이스를 제공하는 시스템에는없는 것으로 가정해야합니다. 이 표준 크기를 확인하는 데 표준 offsetof
매크로를 사용할 수 있습니다.
vector
은 해당 구성 요소를 연속적으로 저장하므로 vector
을 char
크기로 조정하고 버퍼를 유지하는 데 사용할 수 있습니다. vector
을 사용하면 free
또는 delete[]
버퍼를 수동으로 의무적으로 면제 해줍니다.
이와 같이해야합니다.
std::string RecvMessage()
{
extern size_t size; // maximum size, should be a parameter??
extern int MSGQ_ID; // message queue id, should be a parameter??
extern long MSG_ID; // message type, should be a parameter??
// ugly struct hack required by msgrcv
struct RawMessage {
long mtype;
char mdata[1];
};
size_t data_offset = offsetof(RawMessage, mdata);
// Allocate a buffer of the correct size for message
std::vector<char> msgbuf(size + data_offset);
ssize_t bytes_read;
// Read raw message
if((bytes_read = msgrcv(MSGQ_ID, &msgbuf[0], size, MSG_ID, 0)) < 0)
{
throw MsgRecvFailedException();
}
// a string encapsulates the data and the size, why not just return one
return std::string(msgbuf.begin() + data_offset, msgbuf.begin() + data_offset + bytes_read);
}
은 그냥 msgsnd는 인터페이스에 의해 필요에 따라
struct
해킹 호환되는 데이터 배열에 데이터 팩을 가지고, 다른 방법으로 이동합니다. 다른 사람들이 포인터를 가지고 있기 때문에 좋은 인터페이스는 아니지만, 구현에 정의 된 동작 및 정렬 문제를 살펴볼 때 이와 같은 것이 작동해야합니다.
void SendMessage(const std::string& data)
{
extern int MSGQ_ID; // message queue id, should be a parameter??
extern long MSG_ID; // message type, should be a parameter??
// ugly struct hack required by msgsnd
struct RawMessage {
long mtype;
char mdata[1];
};
size_t data_offset = offsetof(RawMessage, mdata);
// Allocate a buffer of the required size for message
std::vector<char> msgbuf(data.size() + data_offset);
long mtype = MSG_ID;
const char* mtypeptr = reinterpret_cast<char*>(&mtype);
std::copy(mtypeptr, mtypeptr + sizeof mtype, &msgbuf[0]);
std::copy(data.begin(), data.end(), &msgbuf[data_offset]);
int result = msgsnd(MSGQ_ID, &msgbuf[0], msgbuf.size(), 0);
if (result != 0)
{
throw MsgSendFailedException();
}
}
C++의 경우 항상 new를 사용하십시오. malloc을 절대로 사용하지 마십시오. –
그리고 가능한 경우 새로운 것을 피하십시오. –
"문제는 malloc 호출 인 것 같습니다." 왜 이걸 생각하니? 어떤 오류/진단을 받고 있습니까? 이것은 런타임 오류 또는 컴파일 시간 오류입니까? 더 많은 정보가 필요합니다. –