В принципе, это то, что у меня есть:shared_ptr <EVP_PKEY> с EVP_PKEY_free как пользовательские Deleter вызывает повреждение кучи
{
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);
Я в недоумении, почему это может происходить. Я знаю, что второй код не рекомендуется, но я сделал это, чтобы проверить, что произойдет.
Вам необходимо опубликовать полный, компилируемый, исполняемый тестовый пример, который воспроизводит проблему. – xaxxon
Может быть, 'std :: shared_ptr evpKeyPtr (EVP_PKEY_new(), [] (EVP_PKEY * p) {EVP_PKEY_free (p);});'? –
Возможно, вы захотите попробовать C++ 11 и 'unique_ptr'. Я использую его часто, и я знаю, что он работает. Я никогда не пробовал шаблон C++ 03 и 'shared_ptr'. Для этого я считаю, что вам нужно вызвать 'release' (а не' get'): 'EVP_PKEY_free (evpKeyPtr.release())'. Когда вы вызываете 'release', вы больше не можете использовать' evpKeyPtr'. – jww