我在C#语言中使用ZeroMQ。它抛出以下错误:
OutOfMemoryException: zmq_msg_init_size
以下是代码段:
private void onDataArrived(object sender, DataArrivedEventArgs e)
{
// receive the data in the form of bytearray
var message = new ZMessage{ new ZFrame(bytearray) };
publisher.Send(message);
}
onDataArrived
是一个回调函数。发布者在类构造函数中定义如下:
zmqContext = new ZContext();
publisher = new ZSocket(zmqContext, ZSocketType.PUB);
publisher.Bind("tcp://*:9001"); // Using depth data port
有什么建议吗?
我是否需要销毁 message
?
请注意,我只想发送bytearray
。由于我不了解最佳方式,因此我创建了ZFrame
和ZMessage
个对象。
在Visual Studio调试器中,我注意到进程内存不断增加并上升到4 GB
。此时正在抛出错误。
答案 0 :(得分:2)
ZFrame
实施IDisposable
。作为常规规则,当您“完成”它们时,您应该Dispose
个IDisposable
个对象。
对ZFrame
尤为重要,因为它包含DispoIntPtr
(指向非托管内存的指针)。
如果没有Dispose
电话,则不会及时释放。见https://github.com/zeromq/clrzmq4/blob/master/ZFrame.cs:
protected override void Dispose(bool disposing)
{
if (framePtr != null)
{
if (framePtr.Ptr != IntPtr.Zero)
{
Close(); // <- cleanup happening here
}
}
GC.SuppressFinalize(this);
base.Dispose(disposing);
}