首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CryptoPP::StreamTransformationFilter中可能存在内存泄漏

CryptoPP::StreamTransformationFilter中可能存在内存泄漏
EN

Stack Overflow用户
提问于 2020-07-31 12:37:48
回答 1查看 99关注 0票数 0

我指的是以下链接:https://www.cryptopp.com/wiki/StreamTransformationFilterhttps://www.cryptopp.com/wiki/CBC_Mode

StringSource string_source(encypted_data, true, new StreamTransformationFilter(decryption, new StringSink(plain_data)));行中,我们使用new操作符在堆上创建了类StreamTransformationFilter和StringSink的对象;但是我们没有删除它们。它不应该导致内存泄漏,因为它们不是删除操作。

我是否应该更换

代码语言:javascript
运行
复制
StringSource string_source(plain_data, true, new StreamTransformationFilter(encryption, new StringSink(encypted_data)));

使用以下代码

代码语言:javascript
运行
复制
try
{
    CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption   encryption(this->aes_key.data(), this->aes_key.size(), this->aes_iv.data(), this->aes_iv.size())
    CryptoPP::StringSink                            string_sink(encypted_data);
    CryptoPP::StreamTransformationFilter            stf_encryptor(encryption, string_sink);
    CryptoPP::StringSource                          string_source(plain_data, true, stf_encryptor);
}

为了避免内存链接,一旦退出try块,类CryptoPP::StringSinkCryptoPP::StreamTransformationFilterCryptoPP::StringSource上的析构函数就会被调用。

程序:

代码语言:javascript
运行
复制
std::optional<std::string> Cryptography::decrypt_data(const std::string& encypted_data)
{
    std::optional<std::string> plain_data { std::nullopt };
    try
    {
        CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption   decryption(this->aes_key.data(), this->aes_key.size(), this->aes_iv.data(), this->aes_iv.size())
        StringSource string_source(encypted_data, true, new StreamTransformationFilter(decryption, new StringSink(plain_data)));
    }
    catch(const CryptoPP::Exception& e)
    {
#ifdef _DEBUG
        spdlog::error("CryptoPP Exception in Cryptography::decrypt_data : {}", ex.what());
#endif
        PLOG_ERROR << ex.what();
    }
    catch(const std::exception& ex)
    {
#ifdef _DEBUG
        spdlog::error("Exception in Cryptography::decrypt_data : {}", ex.what());
#endif
        PLOG_ERROR << ex.what();
    }
    return plain_data;
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-31 13:08:16

当您将过滤器/接收器传递给filer/source的构造函数时,它将获得指针的所有权,并在销毁时将其删除。

在您的示例中,StringSource删除StreamTransformationFilter,进而删除StringSink

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63185888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档