gpt4 book ai didi

c - 如何提供一致的接口(interface) : Deep-Copy OpenSSL structs or Document Distinct Cases?

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:49 24 4
gpt4 key购买 nike

我正在开发一个执行加密任务的应用程序。它使用 OpenSSL 执行这些任务,其界面类似于 libcurl。如果不熟悉,它看起来像这样:

conf_func(handle, ENUM_OPTION, value);

从而将 ENUM_OPTION 表示的选项设置为实例 handle 上的 value。阅读 libcurl 的文档,它说它复制所有值(除非另有说明),因此您释放了您分配的内容,它释放了它分配的内容。

我认为这对我的应用程序来说可能是个好主意。虽然它会增加内存需求,但它确实使使用更容易。但是,我在这里遇到了一个问题。假设这段代码:

X509 *cert = X509_new();
X509 *cert_copy = malloc(sizeof(X509));
memcpy(cert_copy, cert, sizeof(X509));

这当然会产生一个问题:它只是一个浅拷贝,释放会有问题。经过搜索,我认为深拷贝不是 OpenSSL 原生提供的,甚至可能不是我们想要的(内存使用)。

因此,我采取了不同的方法:我不复制,而只是存储我传递的指针:

X509 *cert = X509_new();
X509 *cert_copy = cert;
X509_free(cert_copy);

这将减少内存占用并简化开发。另一方面,这将提高文档需求和特殊使用意识:你分配,但我为你免费。

所以我想也许我应该始终如一地提供这种行为?但是后来我遇到了字符串问题:

char *s = "Some text";
char *s_copy = s;
free(s_copy);

这将不起作用,因为 s 是常量并且没有分配在堆上。

所以这就是我的困境:我将不得不复制字符串而不是复制 OpenSSL 结构。我如何干净地解决这个问题?我是否将其记录下来并依赖用户正确使用我的界面?还是我遗漏了一些非常明显的东西?

注意:Me freeing 意味着我在使用结束时有一个通用的销毁函数。它只会检查指针是否为 NULL,否则为 free。

最佳答案

正如您所发现的,没有正确的方法来“深度复制”属于库的不透明数据对象,除非该库公开用于执行复制的 API。您有多种选择:

  1. 不要让调用者传入属于库的对象,而只是传递创建所述对象所需的信息/参数。然后,您的代码可以自由调用库来创建对象。

  2. 设计您的接口(interface)契约,使您的代码成为传递给它的对象的“所有者”,调用者在传递它们后不得再使用它们。

  3. 设计您的接口(interface)契约,以便在调用者和您的代码之间明确共享所有权。例如,这可能意味着当您的代码仍然引用该对象时,调用者不会修改或释放该对象,但是在您的代码使用完它之后,调用者可以再次自由使用它并负责释放它。

哪种方法最好在很大程度上取决于应用程序的要求。除非内存或性能是关键问题,否则我会选择以简单性取胜的设计。

关于c - 如何提供一致的接口(interface) : Deep-Copy OpenSSL structs or Document Distinct Cases?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15978741/

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