Wt утечка памяти? - PullRequest
       34

Wt утечка памяти?

2 голосов
/ 09 апреля 2020

Я только начал работать с 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);
    });
}

1 Ответ

1 голос
/ 09 апреля 2020

createHugeString(), вероятно, увеличит использование памяти, даже без утечки: вы фрагментируете память.

reserve правильный размер для htmlStr должен избегать некоторых фрагментаций.

...