gpt4 book ai didi

c++ - gSoap 中适当的内存控制

转载 作者:行者123 更新时间:2023-11-28 05:14:16 25 4
gpt4 key购买 nike

我目前正在使用 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_Xsoap_del_X 函数,请分别使用带有选项 -Ec-Ed 的 soapcpp2。

原则上,静态和堆栈分配的数据也可以序列化。但请考虑改用托管堆。

参见 https://www.genivia.com/doc/databinding/html/index.html#memory2了解更多详情和示例。

希望这对您有所帮助。

关于c++ - gSoap 中适当的内存控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com