views:

216

answers:

3

I am developing an application that needs to work on Linux, Windows and Mac OS X. To that purpose, I am using C++ with Qt.

For many reasons, on Mac OS X, I need to use CoreFoundation functions (such as CFBundleCopyBundleURL) that creates core objects that need to be released with CFRelease. But doing so generate a lots of these warnings:

*** __NSAutoreleaseNoPool(): Object 0x224f7e0 of class NSURL autoreleased with no pool in place - just leaking

All the code I've seen concerning these autorelease pools are written in Objective-C. Does anybody know how to create/use autorelease pools in C or C++?

+1  A: 

All the code I've seen concerning these autorelease pools are written in Objective-C.

Because autorelease pools only exist in Cocoa and Cocoa Touch.

Does anybody know how to create/use autorelease pools in C or C++?

The only way to do it is to wrap Cocoa code (the creation and drainage of a pool) in a pair of C functions. Even then, that is an ugly hack that merely masks a deeper problem.

What you really should do is find out exactly what is autoreleasing objects (Instruments will help you do this) and either fix it or excise it.

Peter Hosey
I looked at Instruments, and it seems large and complex. Could you help me at least on where to start to use it for this problem?
PierreBdR
Actually, for this, it would be easier to run in the debugger and break on `__NSAutoreleaseNoPool`.
Peter Hosey
A: 

The error you get is caused by something somewhere creating an Objective-C class (NSURL) using the convenience static method [NSURL urlWithString:]. Methods that return objects that aren't "alloc" or "copy" should put the object inside an autorelease pool before returning the object. And since you haven't setup one up it'll just crash or leak memory.

I'm not sure exactly how to fix this but you need to put something like:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
doStuff();
[pool release];

somewhere in your code.

wm_eddie
I am sure this code would help if I was using Objective C, but as I stated in my question, it doesn't. And this is the core of the pb: why do I get an Objective C specific error when I am coding using C++?
PierreBdR