带有EVP_PKEY_free的shared_ptr <evp_pkey>作为自定义删除器导致堆损坏

时间:2016-12-16 05:02:51

标签: c++ openssl shared-ptr

基本上,这就是我所拥有的:

{
    shared_ptr<EVP_PKEY> evpKeyPtr{EVP_PKEY_new(), EVP_PKEY_free};
    //get key from file
}

这会导致堆损坏。除此之外:

shared_ptr<EVP_PKEY> evpKeyPtr{EVP_PKEY_new(), EVP_PKEY_free};
//same code as above to get key from file
EVP_PKEY_free(evpKeyPtr.get());
//evpKeyPtr does not go out of scope before the corruption occurs

但这不是:

EVP_PKEY* evpKey = EVP_PKEY_new();
//same code as above to get key from file
EVP_PKEY_free(evpKey);

我不知道为什么会发生这种情况。我知道第二个代码是未经修改的,但我这样做是为了测试会发生什么。

2 个答案:

答案 0 :(得分:1)

你只是获得指针,但shared_ptr仍然是它的拥有者。它将在范围结束时被删除两次。

如果您想获得所有权,请使用unique_ptr(它有release()方法)。

答案 1 :(得分:0)

我刚刚意识到我做错了什么,它几乎与std::shared_ptr无关。我试图使用一个临时指向std::shared_ptr的基础指针的方法。