封装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
相关产品推荐
相关产品推荐

