You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

封装OpenSSL RSA类时对不完整类型RSA使用sizeof报错如何解决

错误原因

这个编译错误不是缺少头文件导致的。OpenSSL 1.1.0及以上版本将RSA(即rsa_st)定义为不透明类型,完整结构体定义没有对外暴露在公开头文件中,因此编译器无法获取该类型的内存大小,sizeof操作无法执行。
另外你当前采用memcpy直接拷贝结构体的方案本身也存在逻辑问题:RSA结构体内部存在指向其他动态分配内存区域的指针,直接浅拷贝会导致两个Rsa类实例持有指向同一块内存的指针,后续实例销毁时会触发double free、野指针访问等严重问题。


正确实现方案

OpenSSL 原生提供了RSA对象的深拷贝接口,你直接调用对应接口即可:

  • 若待拷贝的RSA实例持有完整公私钥对:使用RSAPrivateKey_dup接口
  • 若待拷贝的RSA实例仅持有公钥:使用RSAPublicKey_dup接口

拷贝构造函数示例代码

#include <stdexcept>

Rsa::Rsa(const Rsa &rsa)
{
    // 优先尝试私钥拷贝
    this->rsaptr = RSAPrivateKey_dup(rsa.rsaptr);
    if (this->rsaptr == nullptr) {
        // 私钥拷贝失败说明仅持有公钥,尝试公钥拷贝
        this->rsaptr = RSAPublicKey_dup(rsa.rsaptr);
    }
    // 拷贝失败处理逻辑,可根据业务需求调整
    if (this->rsaptr == nullptr) {
        throw std::runtime_error("RSA 对象拷贝失败");
    }
}

补充注意点

  • 确保链接的OpenSSL库版本和编译时引入的头文件版本一致,避免接口不匹配问题
  • 你的Rsa类析构函数中需要调用RSA_free释放rsaptr指针,避免内存泄漏

内容的提问来源于stack exchange,提问作者T0maas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:18:04