我刚开始使用Wt,程序使用的内存似乎在不断增加(如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);
});
}发布于 2020-04-09 23:18:11
createHugeString()可能会增加内存使用量,即使没有泄漏也是如此:您会将内存碎片。
对于htmlStr,reserve正确的维度应该避免一些碎片。
https://stackoverflow.com/questions/61124399
复制相似问题