命名pipe道dynamic内存策略?

Hokay所以我有一个应用程序,我需要一些IPC …我认为命名pipe道是要走的路,因为它们很容易使用。

无论如何,我有一个关于如何处理dynamic内存使用命名pipe道的问题。

说我有这样的课:

class MyTestClass { public: MyTestClass() { _data = new int(4); } int GetData() { return *_data; } int GetData2() { return _data2; } private: int* _data; int _data2; }; 

现在,当我创build一个充满MyTestClass对象的缓冲区,然后通过pipe道发送它们时,我显然正在丢失目标进程中的_data并且正在被垃圾回收。 我应该使用这个策略吗? 我可以使用值types的简单情况,但对于许多复杂的类我需要使用某种forms的dynamic内存,我喜欢指针。

或者,我应该看看使用共享内存呢? 谢谢

命名管道和共享内存都有类似的问题:您需要将结构的内容序列化到发送端,并从接收端反序列化结构。

无论您使用的是命名管道还是共享内存,序列化过程本质上都是相同的。 对于嵌入式指针(如_data和_data2),您需要以一致的方式序列化指针的内容。

有很多序列化策略可以使用,这取决于你的结构在内存中的布局以及IPC的效率。 或者你可以使用DCE RPC,让RPC封送代码为你处理复杂性。

要通过命名管道发送数据,必须在发送端序列化(或编组)数据,并在接收端反序列化(或解组)。

这听起来很可疑,就好像你只是在数据结构中写了一个字节的副本。 这是没有用的。 你不是复制分配的数据(它不是存储在数据结构的第一个和最后一个字节之间,而是存储在其他地方),你正在从一台机器(或进程)复制一个指针( _data )到另一个机器另一方面,本地进程中的内存地址没有保证的意义。

为自己定义一个有线协议(如果绝望的话,看看ASN.1 – 不要,再想一想,不要那么绝望),它定义了通过线路传输的数据的布局。 然后实现发送者和接收者(或者seralizer和deserializer)功能。 或者找到其他人的代码已经这样做了。

还要记住处理endian – ness – 你必须定义哪个序列的字节通过命名管道发送。

例如,您可以定义发送的消息由网络字节顺序中的一个4字节无符号整数组成,定义了多少个结构遵循,每个结构可以是一个由4个有符号4字节整数组成的序列,然后是一个有符号_data2 4字节整数(也以网络字节顺序发送)。

请注意,命名管道作为IPC机制的选择在很大程度上是不重要的; 除非你使用的是共享内存(固有地在同一台机器上),那么endian-ness必须被处理,即使共享内存,你也需要处理序列化。