[Kst] kdeextragear-2/kst/kst

George Staikos staikos at kde.org
Tue Jul 27 00:36:28 CEST 2004


On Monday 26 July 2004 18:19, Andrew Walker wrote:
> CVS commit by arwalker:
>
> With the advent of Linux being able to function as a memory manager and not
> just an address space manager this kind of memory check is no longer
> pointless. George, I'd appreciate if you'd leave these kind of checks alone
> - which I believe is the decision that we arrived with Barth some time ago.

   You are missing the point here.  The big allocations of primitive blocks 
are perfectly fine to check, especially since they use malloc().  QObjects 
are not.  No matter what you do, you cannot, ever, prevent such a crash on 
OOM with Qt based applications.  The best you could possibly do is catch an 
exception and exit() immediately.  Even checking for null is futile since it 
is equally likely that any internal malloc (Qt does very many!) could fail 
instead of the first one.  I discussed this with various people from 
Trolltech recently.  I also saw slides from them about the number of mallocs 
that are done implicitly in various classes.  It's huge.  (Qt4 fixes this, 
but there are always still internal mallocs.)  

   In this specific case, in most or all of the call sequences, Kst will still 
be guaranteed to crash because of following calls.  See kstfitdialog around 
line 266.  KstSharedPtr<Plugin> pPtr = PluginCollection::self()->.....

    That line will most likely crash.  If not, you've got a big collection of 
them following.  Note that QString() construction and various other QString 
operations used here cause multiple mallocs.

   Putting objects on the stack is insufficient - almost all of them put 
something on the heap in their constructor.

   In the end, adding if() around QObject mallocs is:
- pointless, since it never returns 0  (the C++ Working Paper requires that 
"new" never return a null pointer)
- ugly and cluttering up the code
- adding unnecessary branches
- doomed to fail even if it did return 0

> --- kdeextragear-2/kst/kst/kstfitdialog_i.cpp  #1.25:1.26
> @@ -736,7 +736,9 @@ void KstFitDialogI::pluginChanged(int id
>  void KstFitDialogI::showPluginManager() {
>    PluginManager *pm = new PluginManager(this, "Plugin Manager");
> +  if (pm) {
>    pm->exec();
>    delete pm;
>    updatePluginList();
> +  }
>  }

-- 
George Staikos
KDE Developer			http://www.kde.org/
Staikos Computing Services Inc.	http://www.staikos.net/



More information about the Kst mailing list