Я только начал работать с Wt , и кажется, что память, используемая программой, постоянно увеличивается (как показывает системный монитор в Ubuntu). Это происходит во многих различных контекстах, даже если деструкторы вызываются.
Я предполагаю, что Wt хранит копии некоторых данных, и мне интересно, есть ли способ заставить Wt освободить эту память.
Простейшим примером (добавленным ниже) является приложение это создает / удаляет WText с огромной строкой. Многократный вызов create / delete slots приводит к постоянному увеличению памяти. Для забавы я добавил две кнопки, которые вызывают эти слоты из браузера.
Вот код
#include <Wt/WApplication.h>
#include <Wt/WBreak.h>
#include <Wt/WContainerWidget.h>
#include <Wt/WPushButton.h>
#include <Wt/WText.h>
using namespace Wt;
class App: public Wt::WApplication
{
public:
App(const Wt::WEnvironment& env);
private:
static std::string createHugeString();
void createWText()
{ if(!m_widgetPtr)
m_widgetPtr=this->root()->addNew<Wt::WText>(createHugeString());
}
void deleteWText()
{ if(m_widgetPtr)
auto uptr=root()->removeChild(m_widgetPtr);
// will be deleted by unique_ptr dtor
m_widgetPtr=nullptr;
}
Wt::WWidget *m_widgetPtr = nullptr;
};
App::App(const Wt::WEnvironment& env)
:Wt::WApplication(env)
{
auto *createTextButtonPtr = root()->addNew<WPushButton>("Create WText");
auto *delTextButtonPtr = root()->addNew<WPushButton>("Delete WText");
root()->addNew<WBreak>();
createTextButtonPtr->clicked().connect(this,&App::createWText);
delTextButtonPtr->clicked().connect(this,&App::deleteWText);
} //constructor
std::string App::createHugeString()
{
std::string htmlStr;
for(std::size_t i =0; i!=20000000/4; ++i){
htmlStr += "a b ";
}
return htmlStr;
}
int main()
{
char* argv[]= {"progname", "--docroot", "." ,
"--http-address", "0.0.0.0",
"--http-port", "8080"
};
int argc = sizeof(argv)/sizeof(*argv);
return Wt::WRun(argc, argv, [](const Wt::WEnvironment& env) {
return std::make_unique<App>(env);
});
}