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

标签 c memory malloc gsoap

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/

相关文章:

c++ - 如何从 lua 函数返回两个或多个表?

java - Android Java ArrayList 尽可能大的尺寸

C++ 强制 new[] 不分配 4 个额外的字节

c - 使用 char 进行动态内存分配

c - 获取分配的内存空间的特定长度的一部分

c - malloc 失败,两个(几乎)相同的函数之一出现内存损坏

c++ - 函数指针

c - 使用 C 在 Windows 上按相对路径打开文件

c++ - 如何在一行中检查没有定义任何预处理器宏?

python - 垃圾收集时如何确保 Python "zeros"内存?