Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何清理WT中的内存?_C++_Project Management_Persistent Storage_Wt - Fatal编程技术网

C++ 如何清理WT中的内存?

C++ 如何清理WT中的内存?,c++,project-management,persistent-storage,wt,C++,Project Management,Persistent Storage,Wt,2013年3月27日更新 看起来我并没有泄漏内存,只是WT没有在每次点击F5或新用户连接时保持一个持久会话。基本上,旧的会话会被删除,并且每次点击F5或新用户从另一台机器连接时,都会创建一个新的会话。我已经阅读了文档的一些部分,其中提到了使会话持久化,因此当用户重新加载页面或其他用户连接时,他们都会看到相同的内容。然而,我还不能让它工作。我认为这是wt_config.xml文件中的函数调用或设置。如果我取得任何其他进展,将更新 原创帖子 所以我的问题是,如何清理WT中的内存,以便用户每次按页面上

2013年3月27日更新

看起来我并没有泄漏内存,只是WT没有在每次点击F5或新用户连接时保持一个持久会话。基本上,旧的会话会被删除,并且每次点击F5或新用户从另一台机器连接时,都会创建一个新的会话。我已经阅读了文档的一些部分,其中提到了使会话持久化,因此当用户重新加载页面或其他用户连接时,他们都会看到相同的内容。然而,我还不能让它工作。我认为这是wt_config.xml文件中的函数调用或设置。如果我取得任何其他进展,将更新

原创帖子

所以我的问题是,如何清理WT中的内存,以便用户每次按页面上的F5键时,任务管理器中的内存使用保持不变

好的,我正在使用WT发音(witty),我注意到每当用户点击页面上的F5刷新它时,我的服务器应用程序都会消耗更多的内存,这在我看来似乎是内存泄漏,但我遵循了与WT大多数基本应用程序相同的过程

因此,我回到了我能找到的最基本的WT应用程序,hello应用程序。如果您没有亲自构建该项目,可以在这里找到该应用程序的代码和工作示例()

一旦我在我的机器上运行了这个示例并点击页面上的F5,我的任务管理器中的内存就增加了

我可能的怀疑是下面这个函数

WApplication *createApplication(const WEnvironment& env)
{
  /*
  * You could read information from the environment to decide whether
  * the user has permission to start a new application
  */
  return new HelloApplication(env);
}
每次命中F5时都会调用它,并生成继承自WaApplication的HelloApplication的新实例

我尝试过的一些补救措施没有奏效,包括:为HelloApplication保留两个指针,以便每次分配新指针时都可以删除旧指针。调用quit()函数并删除指针。只需调用quit()函数。我还查看了WT文档站点()以获得关于该类及其方法的更详细信息,但没有找到任何有效的方法


我要求任何回复者尽可能详细地说明如何处理内存清理。请举个例子,谢谢

waapplication手册说,当调用createApplication回调时创建它,当调用quit和会话超时时,Wt删除它。默认会话超时为10分钟(wt_config.xml),因此这可能是按F5时内存消耗最初增加的原因


与此不同的是,操作系统报告的内存消耗不是确定应用程序是否泄漏内存的可靠方法。使用适当的内存检查工具,如valgrind。

您还必须知道,从Wt 3.3.0开始,只有在收到请求时才会清理会话(请参阅Wt开发人员的说明)。为了克服这个限制,开发人员建议使用类似于以下代码的东西

static bool terminating = false;

void
callRepeatedly(boost::function<void()> function, int seconds)
{
    if (!terminating) {
        Wt::WServer::instance()->ioService().schedule(
            seconds * 1000, boost::bind(callRepeatedly, function, seconds));
    }
    function();
}

int
main(int argc, char** argv)
{
    ...

    callRepeatedly(boost::bind(&Wt::WServer::expireSessions, &server), 60);
    Wt::WServer::waitForShutdown();
    terminating = true;
    server.stop();

    ...
}
静态布尔终止=假;
无效的
重复调用(boost::function,int秒)
{
如果(!终止){
Wt::WSServer::instance()->ioService().schedule(
秒*1000,boost::bind(重复调用,函数,秒));
}
函数();
}
int
主(内部argc,字符**argv)
{
...
重复调用(boost::bind(&Wt::WServer::expireSessions,&server),60);
Wt::WSServer::WaitForShutton();
终止=真;
server.stop();
...
}

当我启动wt并运行自己的更新时,我遇到了内存问题,这不是内存泄漏。您帮助我注意到这不是内存泄漏。还做了一个更新。很有趣,我得试试这个!我会在我有工作的时候发布更新。