wxString中是否存在内存泄露?

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

wxString中是否存在内存泄露?

Post by ccnyou »

看这段代码:

Code: Select all

int _tmain()
{
	wxString* aString = new wxString(wxT("a wxString"));
	cout << aString->ToStdString() << endl;
	delete aString;
	scanf("%*c");
	return 0;
}

在vs2008下调试模式运行,输出窗口提示有内存泄露:

Code: Select all

Detected memory leaks!
Dumping objects ->
{518} normal block at 0x00B20700, 256 bytes long.
 Data: <t ` | `   `   ` > 74 98 60 00 7C 98 60 00 84 98 60 00 8C 98 60 00 
{517} normal block at 0x00B203C0, 772 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
{516} normal block at 0x003FA950, 28 bytes long.
 Data: <                > C0 03 B2 00 C1 00 00 00 00 00 00 00 CD CD CD CD 
Object dump complete.
我使用的wxWidgets版本是2.9.4,谢谢。
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

Re: wxString中是否存在内存泄露?

Post by ccnyou »

anyone here?
kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: wxString中是否存在内存泄露?

Post by kipade »

当然不是
应用这么频繁的类要是再有内存泄露,wx根本就不会面世见人
你的这些代码,就算你的main函数里面只写一个return 0;
也丝毫影响不了你的结论

--你是不是想拿过来就用啊?得先了解一下子的哦,再就是,出这样的问题之后要看问题出在哪里
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

Re: wxString中是否存在内存泄露?

Post by ccnyou »

kipade wrote:当然不是
应用这么频繁的类要是再有内存泄露,wx根本就不会面世见人
你的这些代码,就算你的main函数里面只写一个return 0;
也丝毫影响不了你的结论

--你是不是想拿过来就用啊?得先了解一下子的哦,再就是,出这样的问题之后要看问题出在哪里
thank you a lot for your help !
恩,我了解过Dialog Base 和 Frame Base的编写,由于单元测试的需要,想要编写基于控制台的程序来测试,
所以就这样建立了个demo。或许我应该去了解下 Console Base App 的编写。
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

Re: wxString中是否存在内存泄露?

Post by ccnyou »

事实上我应该先初始化,像这样:

Code: Select all

    wxInitializer initializer;
    if ( !initializer )
    {
        fprintf(stderr, "Failed to initialize the wxWidgets library, aborting.");
        return -1;
    }
kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: wxString中是否存在内存泄露?

Post by kipade »

原因很简单,wx有不少全局变量哦,是new出来的。
至于你使用wxInitializer的办法,你自己试过了才好,这个在WX的宏定定义都做好了

其实,要是都遵循WX的基本结构问题就简单了。这一点挺像MFC的
class testApp : public wxApp
{
virtual bool OnInit()
{
//把你原来在main函数里面完成的东西放这儿来就行了
return false;//这里的返回false很重要!
}
};
IMPLEMENT_APP_CONSOLE(testApp)

你看上面的宏定义就明白了,如果是GUI程序就是IMPLEMENT_APP了
这个办法很像MFC的做法,我还没看到wx推荐的做法,你自己摸索了
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

Re: wxString中是否存在内存泄露?

Post by ccnyou »

kipade wrote:原因很简单,wx有不少全局变量哦,是new出来的。
至于你使用wxInitializer的办法,你自己试过了才好,这个在WX的宏定定义都做好了

其实,要是都遵循WX的基本结构问题就简单了。这一点挺像MFC的
class testApp : public wxApp
{
virtual bool OnInit()
{
//把你原来在main函数里面完成的东西放这儿来就行了
return false;//这里的返回false很重要!
}
};
IMPLEMENT_APP_CONSOLE(testApp)

你看上面的宏定义就明白了,如果是GUI程序就是IMPLEMENT_APP了
这个办法很像MFC的做法,我还没看到wx推荐的做法,你自己摸索了
一开始不知道为什么说return false 很重要,看到文档这样说的。不过Sample中的Console那个例子并不是写成wxApp 子类的
文档原文是这样的

Code: Select all

This must be provided by the application, and will usually create the application's main window, optionally calling SetTopWindow(). 

You may use OnExit() to clean up anything initialized here, provided that the function returns true.

Notice that if you want to use the command line processing provided by wxWidgets you have to call the base class version in the derived class OnInit().

Return true to continue processing, false to exit the application immediately. 

kipade
Earned some good credits
Earned some good credits
Posts: 126
Joined: Fri Nov 11, 2011 2:45 am
Location: China

Re: wxString中是否存在内存泄露?

Post by kipade »

这些都是无关紧要的了,其实,如果还要继续沿于之前的main入口,也不是不可以,只是得调用wx的初始化函数,退出之前调用wx的清理函数
如下:

Code: Select all

int main(int argc,char* argv[])
{
   wxInitialize();

   ....//这里放置你的程序代码

  wxUninitialize();
  return 0;
}
这样是不是省了你app部分代码?
你看一下这两个函数的实现就很明了了
Slackware GNU/Linux x86_64
wxWidgets-3.3.0
ccnyou
Knows some wx things
Knows some wx things
Posts: 33
Joined: Fri Sep 28, 2012 8:08 am

Re: wxString中是否存在内存泄露?

Post by ccnyou »

kipade wrote:这些都是无关紧要的了,其实,如果还要继续沿于之前的main入口,也不是不可以,只是得调用wx的初始化函数,退出之前调用wx的清理函数
如下:

Code: Select all

int main(int argc,char* argv[])
{
   wxInitialize();

   ....//这里放置你的程序代码

  wxUninitialize();
  return 0;
}
这样是不是省了你app部分代码?
你看一下这两个函数的实现就很明了了
这样也可以,但是wxWidgets中的example的做法是

wxInitializer initializer;
或者
wxInitializer initializer(argc,argv);
Post Reply