C API 允许自动存储和分配存储
C API allowing for both automatic and allocated storage
我正在编写一个 API 结构,例如
struct datast{
int a;
int *items;
size_t numitems;
};
我正在提供释放此类结构内容的函数(以类似于 C++ 析构函数所做的方式)。未提供构造函数,因为我要求对它们进行零初始化(.items
字段在初始化时需要是一个 NULL
指针,这使其适用于以后的 realloc()
和 free()
).
但是,我提供了一个 additem()
函数,该函数 realloc()
s .items
并相应地增加 .numitems
。
但是,因为这些结构很小,我想鼓励使用指定的初始化器和复合字面量,这样用户就可以在可能的情况下方便地用一行代码创建这些对象,而不必手动调用 additem()
.
但是,如果您使用指定的初始值设定项初始化这些结构(或从复合文字分配给它们),.items
字段将具有自动存储而不是分配的存储。因此,如果稍后将此结构传递给“释放”function/destructor,您将使用非法指针(指向自动存储)调用 free()
。
是的,我知道措辞可能是“不要为你没有调用的对象调用析构函数additem()
” ...但这看起来真的很笨拙,看起来设计很糟糕。
不知何故,这就像我必须决定是否所有这些对象应该具有自动存储或分配存储,而不向用户提供这两种可能性。
你遇到过这样的场景吗?有没有我可以使用的设计可以为自动存储和分配存储提供干净优雅的界面?
添加一个布尔成员items_allocated
。您强制执行的零初始化将使 false
。然后 additem()
将设置它 true
:
struct datast
{
int a;
int *items;
bool items_allocated ;
size_t numitems;
} ;
然后你的析构函数可以有类似的东西:
if( d->items_allocated )
{
free( d->items ) ;
d->items = NULL ;
}
d->numitems = 0 ;
...
我正在编写一个 API 结构,例如
struct datast{
int a;
int *items;
size_t numitems;
};
我正在提供释放此类结构内容的函数(以类似于 C++ 析构函数所做的方式)。未提供构造函数,因为我要求对它们进行零初始化(.items
字段在初始化时需要是一个 NULL
指针,这使其适用于以后的 realloc()
和 free()
).
但是,我提供了一个 additem()
函数,该函数 realloc()
s .items
并相应地增加 .numitems
。
但是,因为这些结构很小,我想鼓励使用指定的初始化器和复合字面量,这样用户就可以在可能的情况下方便地用一行代码创建这些对象,而不必手动调用 additem()
.
但是,如果您使用指定的初始值设定项初始化这些结构(或从复合文字分配给它们),.items
字段将具有自动存储而不是分配的存储。因此,如果稍后将此结构传递给“释放”function/destructor,您将使用非法指针(指向自动存储)调用 free()
。
是的,我知道措辞可能是“不要为你没有调用的对象调用析构函数additem()
” ...但这看起来真的很笨拙,看起来设计很糟糕。
不知何故,这就像我必须决定是否所有这些对象应该具有自动存储或分配存储,而不向用户提供这两种可能性。
你遇到过这样的场景吗?有没有我可以使用的设计可以为自动存储和分配存储提供干净优雅的界面?
添加一个布尔成员items_allocated
。您强制执行的零初始化将使 false
。然后 additem()
将设置它 true
:
struct datast
{
int a;
int *items;
bool items_allocated ;
size_t numitems;
} ;
然后你的析构函数可以有类似的东西:
if( d->items_allocated )
{
free( d->items ) ;
d->items = NULL ;
}
d->numitems = 0 ;
...