1

我正在编写一个具有以下结构的 API

struct datast{
int a;
int *items;
size_t numitems;
};

我正在提供释放此类结构内容的函数(以与 C++ 析构函数类似的方式)。没有提供构造函数,因为我要求对它们进行零初始化(该.items字段必须是NULL初始化时的指针,这使其适用于以后的realloc()free())。

然而,我提供了一个additem()函数,它会相应地增加realloc().items.numitems

然而,由于这些结构体很小,我想鼓励使用指定的初始化器和复合字面量,以便用户可以在可能的情况下方便地使用单行创建这些对象,而无需手动调用additem().

但是,如果您使用指定的初始化程序(或从复合文字分配给它们)初始化此类结构,则该.items字段将具有自动存储而不是分配的存储。因此,如果稍后将此结构传递给“释放”函数/析构函数,您将free()使用非法指针(指向自动存储)进行调用。

是的,我知道措辞可能是“不要为你没有调用的对象调用析构函数additem() ......但这看起来真的很笨拙,而且似乎是糟糕的设计。

不知何故,就像我必须决定是否所有这些对象都应该具有自动或分配的存储空间,而不是为用户提供两种可能性。

你有没有遇到过这样的场景?我可以使用任何一种设计来为自动和分配的存储提供干净优雅的界面吗?

4

1 回答 1

1

添加一个布尔成员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 ;
...
于 2021-02-20T18:10:30.270 回答