C++ Wt是否正在泄漏内存?

C++ Wt是否正在泄漏内存?,c++,wt,C++,Wt,我刚开始工作,似乎记忆被 程序不断增加(如Ubuntu上的系统监视器所示)。 尽管调用了析构函数,但这在许多不同的上下文中都会发生 我猜Wt正在保存一些数据的副本,我想知道是否有办法 强制Wt释放该内存 最简单的例子(见下文)是一个 创建/删除具有巨大字符串的WText。多次调用创建/删除插槽 导致内存不断增加。为了好玩,我添加了两个按钮,从浏览器中调用这些插槽 这是密码 #include <Wt/WApplication.h> #include <Wt/WBreak.h>

我刚开始工作,似乎记忆被 程序不断增加(如Ubuntu上的系统监视器所示)。 尽管调用了析构函数,但这在许多不同的上下文中都会发生

我猜Wt正在保存一些数据的副本,我想知道是否有办法 强制Wt释放该内存

最简单的例子(见下文)是一个 创建/删除具有巨大字符串的WText。多次调用创建/删除插槽 导致内存不断增加。为了好玩,我添加了两个按钮,从浏览器中调用这些插槽

这是密码

#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);
    });
}
#包括
#包括
#包括
#包括
#包括
使用名称空间Wt;
类应用程序:公共Wt::WAApplication
{
公众:
应用程序(const Wt::WenEnvironment&env);
私人:
静态std::string createHugeString();
void createWText()
{if(!m_widgetpr)
m_widgetPtr=this->root()->addNew(createHugeString());
}
void deleteWText()
{if(m_widgetpr)
auto uptr=root()->removeChild(m_widgetPtr);
//将由唯一的\u ptr dtor删除
m_widgetpr=nullptr;
}
WWidget*m_widgetpr=nullptr;
};
App::App(const Wt::WEnvironment&env)
:Wt::waapplication(环境)
{
auto*createTextButtonPtr=root()->addNew(“创建WText”);
auto*deltextbutonptr=root()->addNew(“删除WText”);
root()->addNew();
createTextButtonPtr->clicked().connect(此,&App::CreateText);
delTextButtonPtr->clicked().connect(此,&App::deleteWText);
}//构造函数
std::string应用程序::createHugeString()
{
std::字符串htmlStr;
对于(标准:尺寸i=0;i!=20000000/4;++i){
htmlStr+=“a b”;
}
返回htmlStr;
}
int main()
{
char*argv[]={“progname”、“--docroot”、“,
“--http地址”,“0.0.0.0”,
--http端口,“8080”
};
int argc=sizeof(argv)/sizeof(*argv);
返回Wt::WRun(argc,argv,[](const Wt::WEnvironment&env){
返回标准::使_唯一(env);
});
}
createHugeString()
可能会增加内存使用率,即使没有泄漏:您将内存碎片化


reserve
htmlStr
保留正确的尺寸应该避免一些碎片。

您是否释放过
m_widgetPtr
指向的对象?看起来就像是从一些小部件列表中删除了它。如果不是,那可能是内存泄漏。您可能应该运行一个设计用于检测内存泄漏的工具,例如,使用
-fsanize=address
编译比valgrind快几倍(而且更准确),但有时设置起来很棘手。代码中有一条注释
//将被unique_ptr dtor删除,但任何地方都没有
unique_ptr
实例。@fredrik root()->removeChild()返回删除WText的临时unique_ptrptr@fredrik它来自于一个
std::vector
,甚至将createHugeString()替换为使用静态存储持续时间引用(正确保留)字符串。但问题仍然存在。系统监视器并不是解决内存泄漏的正确工具。评论中已经提出了2个更好的替代方案。正如我所说,在没有内存泄漏的情况下,我们可能会增加消耗。