Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有动态内存的命名管道策略?_C++_Windows_Linux_Memory Management_Named Pipes - Fatal编程技术网

C++ 具有动态内存的命名管道策略?

C++ 具有动态内存的命名管道策略?,c++,windows,linux,memory-management,named-pipes,C++,Windows,Linux,Memory Management,Named Pipes,所以我有一个应用程序,我需要一些IPC。。。我认为命名管道是一种方式,因为它们很容易使用 无论如何,我有一个关于如何使用命名管道处理动态内存的问题 假设我有这样一门课: class MyTestClass { public: MyTestClass() { _data = new int(4); } int GetData() { return *_data; } int GetData2() { return _data2; } private: int*

所以我有一个应用程序,我需要一些IPC。。。我认为命名管道是一种方式,因为它们很容易使用

无论如何,我有一个关于如何使用命名管道处理动态内存的问题

假设我有这样一门课:

class MyTestClass {
public:
    MyTestClass() { _data = new int(4); }

    int GetData() { return *_data; }
    int GetData2() { return _data2; }

private:
    int* _data;
    int _data2;
};
现在,当我创建一个满是
MyTestClass
对象的缓冲区,然后通过管道发送它们时,很明显,我在目标进程中丢失了数据,并得到了垃圾。有什么策略我应该使用吗?我可以在简单的情况下使用值类型,但对于许多复杂的类,我需要使用某种动态内存,并且我喜欢指针


或者,我应该只考虑使用共享内存吗?谢谢

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

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


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

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

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

为自己定义一个有线协议(如果是desparate,请参阅ASN.1-不,再考虑一下,不要获得该desparate),该协议定义了通过有线传输的数据布局。然后实现发送器和接收器(或序列化器和反序列化器)功能。或者找到其他人的代码,该代码已经完成了

还要记住处理endian ness-您必须定义通过命名管道发送字节的顺序

例如,您可以定义发送的消息由一个4字节的无符号整数组成,该整数按网络字节顺序定义有多少个结构,每个结构可以是一个数组的4个有符号的4字节整数序列,然后是
\u data2
的单个有符号的4字节整数(也按网络字节顺序发送)


请注意,选择命名管道作为IPC机制在很大程度上是无关紧要的;除非您使用共享内存(在同一台机器上),否则必须处理endian ness,即使使用共享内存,您也需要处理序列化。

我认为您应该删除
\u data2
等等。它是不完整的(初始化的),我想没有它你的问题就很清楚了。因为你的构造函数分配内存,你需要一个析构函数来释放内存,不是吗?是的,我确实需要释放它,很抱歉格式不好。。。我只是想说清楚谢谢。。。我就是这么想的。。。我对IPC有些陌生。现在我只是通过haha发送原始字节。。。我想看看这些IPC机制的局限性是什么。关于不在数据结构中的字节,您是100%正确的。。。这正是我想要解决的问题。谢谢你的回复。。。关于我可以使用的协议或序列化策略,有什么建议吗?谢谢如果您正在寻找序列化策略,到目前为止最常见的情况是文件存储。您将如何将类写入文件并在稍后将其读回?如果将IPC通道包装为
std::streambuf
,您可能可以节省大量工作;这样你就可以共享和重用很多代码。MSalters从我口中说出了这些话。他的建议恰到好处。