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

{
    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);


我不知道为什么会发生这种情况。我知道不建议使用第二个代码,但是我这样做是为了测试会发生什么。

最佳答案

您只是获得了指针,但是shared_ptr一直是它的所有者。它将在作用域末尾删除两次。

如果您希望能够获得所有权,请使用unique_ptr(它具有release()方法)。

09-06 23:04