X509_STORE_CTX_init是否释放传入对象?动态创建后需手动释放吗?
OpenSSL X509_STORE_CTX动态创建后的释放规则
核心结论
动态创建的X509_STORE_CTX是否需要手动释放,完全取决于X509_STORE_CTX_init()的执行结果:
- 初始化成功:必须手动调用
X509_STORE_CTX_free()释放资源,X509_STORE_CTX_init()不会自动处理。 - 初始化失败:
X509_STORE_CTX_init()会自动调用X509_STORE_CTX_free()销毁这个动态对象,你不需要再手动释放。
代码示例
// 动态分配X509_STORE_CTX对象 X509_STORE_CTX *ctx = X509_STORE_CTX_new(); if (ctx == NULL) { // 内存分配失败的错误处理 return -1; } // 执行初始化操作 int init_ret = X509_STORE_CTX_init(ctx, store, cert, chain); if (init_ret != 1) { // 初始化失败:ctx已被自动释放,无需再调用X509_STORE_CTX_free() return -1; } // 此处执行证书验证等业务逻辑... // 操作完成后,手动释放动态创建的ctx X509_STORE_CTX_free(ctx);
补充说明(栈创建报错的原因)
官方不推荐栈上创建X509_STORE_CTX的本质原因是:X509_STORE_CTX_init()初始化失败时,会调用X509_STORE_CTX_free()释放传入的ctx对象——而栈内存属于进程栈空间,不能用针对堆内存的free()系列函数操作,这直接导致了你遇到的段错误。
内容的提问来源于stack exchange,提问作者Thundercleez
相关产品推荐
相关产品推荐

