Хорошо, я уже некоторое время пытаюсь обмотать голову вокруг этого, но я не понимаю, может кто-то, пожалуйста, скажите мне, почему случай №1 выбрасывает утверждение (BLOCK TYPE ЯВЛЯЕТСЯ НЕДЕЙСТВИТЕЛЬНЫМ)?shared_ptr throwing утверждать, когда он выходит из сферы действия
дело № 1
mehodName()
{
// Get all dependents for this resource
boost::shared_ptr<std::set<std::string>> dependents = deactivatedResource->getDependendents();
// Do some stuff
} // Assertion thrown here (heap gets corrupted)
Вот что getDependents в этом случае:
boost::shared_ptr<std::set<std::string>> Resource::getDependendents()
{
return boost::shared_ptr<std::set<std::string>>(&dependents);
}
дело № 2
mehodName()
{
// Get all dependents for this resource
std::set<std::string>* dependents = deactivatedResource->getDependendents();
} // No problem !! (but an obvious leak , if I try to use delete ,then the same assertion as in case 1)
Вот что getDependents в этом случае:
std::set<std::string>* Resource::getDependendents()
{
return &dependents;
}
В обоих случаях:
std::set<std::string> dependents;
Что возвращает 'getDependents' (т. Е. Что делает определение этой функции)? Почему вы не используете интеллектуальные указатели последовательно? –
Коррупция происходит до того, как ваш shared_ptr выходит за рамки. Используйте некоторую память, проверенную как valgrind. –
Возможно, вы неправильно понимаете семантику собственности 'getDependents'. Проверьте документацию и/или код. –