gpt4 book ai didi

c - gsoap 为结构的动态数组分配内存。

转载 作者:太空宇宙 更新时间:2023-11-04 03:15:35 26 4
gpt4 key购买 nike

gSoap 有用地创建 stub 来帮助内存管理等。其中之一命令是 soap_malloc 但似乎没有相应的 soap_realloc。在我开始编写自己的 push 和 pop 方法之前,我只想确保我没有遗漏任何明显的东西。

//example.h generated with wsdl2h

struct ns1___Customer
{
int __sizeProduct;
ns1__Product *Product;
int customerid;
}

struct ns1__Product
{
int productid;
}

我目前正在使用 soap_malloc,然后使用 realloc 来动态增长数组。

//I could use soap_new_ns1__Product(&soap,XXX) and allocate mem for XXX
//number of ns1__Product structures but this is wasteful and doesn't solve
//anything

struct ns1__Customter cust;
soap_default_ns1__Product(soap, &cust);

struct ns1__Product *prod_array = NULL;

//allocate mem for 1 product
prod_array = soap_new_ns1__Product(soap,1) ;

soap_default_ns1__Product(soap, &prod_array[0]);
prod_array[0].productid=111;

//Need to add product therefore need to realloc mem.
//IS THIS THE BEST WAY IN gsoap?
prod_array = realloc( prod_array, 2 * sizeof(struct ns1__Product)) ;
soap_default_ns1__Product(soap, &emp_array[1]);
prod_array[1].product=222;

//assigning array ptr to Customer
cust.Product=prod_array;
// Remember to adjust sizeProduct
cust.__sizeProduct=2;

这似乎是错误和笨拙的,gsoap 是否提出了更好的方法?我无法在文档中或通过在线搜索找到明确的示例。

最佳答案

Before I start to write my own push and pop methods I just want to ensure I'm not missing anything obvious.

我怀疑你错过了 soap_malloc()分配至少在某些情况下自动释放的内存。因此,使用 realloc()调整分配内存的大小是自找麻烦。这样的重新分配很有可能会成功,但是当 gSOAP 的自动释放试图在 soap_end() 中启动时,您可能至少会以一团糟告终。 .

另一方面,我认为您没有忽略任何重新分配功能。 The docs确实好像没有描述什么。您始终可以实现自己的重新分配包装器,使用 soap_malloc() 分配新内存。 ,复制原始空间的内容(您需要以某种方式知道其大小),并使用 soap_dealloc() 释放原始空间.

底线似乎是 soap_malloc()不打算成为通用分配器,并且它不是特别适合您的用例。它的主要目标似乎是内部的,以减轻图书馆用户手动释放图书馆分配的临时对象的任何需要。我将其公开给图书馆用户以供他们直接使用是为了方便。

如果你想要重新分配 block 的能力,那么我建议你首先通过常规 malloc() 获得它们.如果您要混合 malloc(),您需要仔细阅读文档。使用 soap_malloc() 编辑数据ed 数据,但很有可能。或者,考虑不需要重新分配的方法,例如将数据存储在链表而不是动态数组中。

关于c - gsoap 为结构的动态数组分配内存。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300672/

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