基本上,这就是我所拥有的:
{
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);
我不知道为什么会发生这种情况。我知道第二个代码是未经修改的,但我这样做是为了测试会发生什么。
答案 0 :(得分:1)
你只是获得指针,但shared_ptr仍然是它的拥有者。它将在范围结束时被删除两次。
如果您想获得所有权,请使用unique_ptr(它有release()方法)。
答案 1 :(得分:0)
我刚刚意识到我做错了什么,它几乎与std::shared_ptr
无关。我试图使用一个临时指向std::shared_ptr
的基础指针的方法。