недавно обнаружил проблему (debian sid) с гццпп - он мне так подвешивает систему, что быстрее просто отправить в перезагрузку. решил воспользоватсья возможностью и перейти на clang
я для прототипа использую python3 и boost::python. кода импортируешь туда класс ,буст может импортировать его как boost::shared_ptr и управлять соответственно. я использую std::shaerd_ptr и вот код (это переделанный код из вики питона)
#include <string>
#include <memory>
#include <boost/python.hpp>
struct A {
static std::shared_ptr<A> create () { ptr=std::shared_ptr<A>(new A); return ptr;}
std::string hello () { return "Just nod if you can hear me!"; }
~A(){std::cout<<"dest"<<std::endl;}
static std::shared_ptr<A> ptr;
};
std::shared_ptr<A> A::ptr;
using namespace boost::python;
BOOST_PYTHON_MODULE(sptr)
{
class_<A, std::shared_ptr<A>>("A")
.def("create",&A::create )
.staticmethod("create")
.def("hello",&A::hello)
;
}
в гцц усе работает. когда говоришь питону del a, где а - это переменная созданная из этого кода, объект не удаляется, он удаляется только при закрытии программы. если закоментировать ptr то объект удаляется сразу - что и требовалось доказать. но! кланг не может это скомпилить не совсем понятно, почему GCC "подвешивает систему", но скорее всего он выжирает память. это бывает по двум причинам: использование гигантских статических массивов начинающими программистами или очень большие проекты. в любом случае, вопрос решается использованием ограничений на память через ulimit и увеличением размера свопа.
у тебя в классе объявлен статический элемент типа shared_ptr. и он действительно создастся при старте и удалится только после завершения программы, когда последняя ссылка (статическое объявление) будет закрыто.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)