- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 gSoap 库开发应用程序,并且对正确使用库有一些误解。我已经生成了包装我自己的类的代理对象(-j 标志),如下所示。应用程序必须 24/7 全天候工作并同时连接到多个摄像头(约 50 个摄像头),因此在每次请求后我都需要清除所有临时数据。在每次请求后调用 soap_destroy() 和 soap_end() 是否正常?因为在每次请求之后都这样做似乎有点矫枉过正。可能存在另一种正确使用的选择?
DeviceBindingProxy::destroy()
{
soap_destroy(this->soap);
soap_end(this->soap);
}
class OnvifDeviceService : public Domain::IDeviceService
{
public:
OnvifDeviceService()
: m_deviceProxy(new DeviceBindingProxy)
{
soap_register_plugin(m_deviceProxy->soap, soap_wsse);
}
int OnvifDeviceService::getDeviceInformation(const Access::Domain::Endpoint &endpoint, Domain::DeviceInformation *information)
{
_tds__GetDeviceInformation tds__GetDeviceInformation;
_tds__GetDeviceInformationResponse tds__GetDeviceInformationResponse;
setupUserPasswordToProxy(endpoint);
m_deviceProxy->soap_endpoint = endpoint.endpoint().c_str();
int result = m_deviceProxy->GetDeviceInformation(&tds__GetDeviceInformation, tds__GetDeviceInformationResponse);
m_deviceProxy->soap_endpoint = NULL;
if (result != SOAP_OK) {
Common::Infrastructure::printSoapError("Fail to get device information.", m_deviceProxy->soap);
m_deviceProxy->destroy();
return -1;
}
*information = Domain::DeviceInformation(tds__GetDeviceInformationResponse.Manufacturer,
tds__GetDeviceInformationResponse.Model,
tds__GetDeviceInformationResponse.FirmwareVersion);
m_deviceProxy->destroy();
return 0;
}
}
最佳答案
确保托管数据的正确分配和解除分配:
soap_destroy(soap);
soap_end(soap);
您希望经常这样做以避免内存被旧数据填满。这些调用会删除所有反序列化数据和您使用 soap_new_X() 和 soap_malloc() 函数分配的数据。
使用 soap_destroy()
后跟 soap_end()
删除所有托管分配。之后可以重新开始分配,再次删除等。
分配托管数据:
SomeClass *obj = soap_new_SomeClass(soap);
您可以使用 soap_malloc
进行原始托管分配,或分配指针数组或 C 字符串:
const char *s = soap_malloc(soap, 100);
请记住,malloc 在 C++ 中并不安全。更好的方法是分配 std::string :
std::string *s = soap_new_std__string(soap);
数组可以用第二个参数分配,例如10 个字符串的数组:
std::string *s = soap_new_std__string(soap, 10);
如果您想保留这些调用会删除的数据,请使用:
soap_unlink(soap, obj);
现在 obj
以后可以用 delete obj
删除。但是请注意,在 soap_destroy()
和 soap_end()
之后,obj
中所有指向托管数据的指针成员都已失效。因此,您可能必须对这些成员调用 soap_unlink()
或冒悬挂指针的风险。
gSOAP 的一个很酷的新特性是自动为任何数据结构生成深度复制和删除函数,从而节省了大量的编码时间:
SomeClass *otherobj = soap_dup_SomeClass(NULL, obj);
这会将 obj
复制到非托管堆空间。这是一个深层拷贝,用于检查对象图中的循环并删除此类循环以避免删除问题。您还可以通过使用 soap
而不是 soap_dup_SomeClass
的第一个参数的 NULL 将整个(循环)托管对象复制到另一个上下文。
深度删除:
soap_del_SomeClass(obj);
这会删除 obj
以及它的成员指向的数据,等等。
要使用 soap_dup_X
和 soap_del_X
函数,请分别使用带有选项 -Ec
和 -Ed
的 soapcpp2。
原则上,静态和堆栈分配的数据也可以序列化。但请考虑改用托管堆。
参见 https://www.genivia.com/doc/databinding/html/index.html#memory2了解更多详情和示例。
希望这对您有所帮助。
关于c++ - gSoap 中适当的内存控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975395/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!