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