Fix File::nonexistent false leak using SharedSingleton

This commit is contained in:
Vinnie Falco
2013-06-30 03:25:20 -07:00
parent 448e65fb4d
commit 53ab279c8a
11 changed files with 48 additions and 24 deletions

View File

@@ -21,6 +21,32 @@
*/
//==============================================================================
// We need to make a shared singleton or else there are
// issues with the leak detector and order of detruction.
//
class NonexistentHolder : public SharedSingleton <NonexistentHolder>
{
public:
NonexistentHolder ()
: SharedSingleton <NonexistentHolder> (SingletonLifetime::persistAfterCreation)
{
}
static NonexistentHolder* createInstance ()
{
return new NonexistentHolder;
}
File const file;
};
File const& File::nonexistent ()
{
return NonexistentHolder::getInstance ()->file;
}
//------------------------------------------------------------------------------
File::File (const String& fullPathName)
: fullPath (parseAbsolutePath (fullPathName))
{
@@ -67,9 +93,6 @@ File& File::operator= (File&& other) noexcept
}
#endif
const File File::nonexistent;
//==============================================================================
String File::parseAbsolutePath (const String& p)
{
@@ -321,7 +344,7 @@ String File::getFileNameWithoutExtension() const
bool File::isAChildOf (const File& potentialParent) const
{
if (potentialParent == File::nonexistent)
if (potentialParent == File::nonexistent ())
return false;
const String ourPath (getPathUpToLastSlash());
@@ -633,7 +656,7 @@ bool File::hasFileExtension (const String& possibleSuffix) const
File File::withFileExtension (const String& newExtension) const
{
if (fullPath.isEmpty())
return File::nonexistent;
return File::nonexistent ();
String filePart (getFileName());
@@ -914,7 +937,7 @@ public:
const File home (File::getSpecialLocation (File::userHomeDirectory));
const File temp (File::getSpecialLocation (File::tempDirectory));
expect (! File::nonexistent.exists());
expect (! File::nonexistent ().exists());
expect (home.isDirectory());
expect (home.exists());
expect (! home.existsAsFile());

View File

@@ -53,7 +53,7 @@ public:
/** Creates an (invalid) file object.
The file is initially set to an empty path, so getFullPath() will return
an empty string, and comparing the file to File::nonexistent will return
an empty string, and comparing the file to File::nonexistent() will return
true.
You can use its operator= method to point it at a proper file.
@@ -100,7 +100,7 @@ public:
//==============================================================================
/** This static constant is used for referring to an 'invalid' file. */
static const File nonexistent;
static File const& nonexistent ();
//==============================================================================
/** Checks whether the file actually exists.

View File

@@ -45,7 +45,7 @@ TemporaryFile::TemporaryFile (const File& target, const int optionFlags)
targetFile (target)
{
// If you use this constructor, you need to give it a valid target file!
bassert (targetFile != File::nonexistent);
bassert (targetFile != File::nonexistent ());
}
TemporaryFile::TemporaryFile (const File& target, const File& temporary)
@@ -74,7 +74,7 @@ bool TemporaryFile::overwriteTargetFileWithTemporary() const
{
// This method only works if you created this object with the constructor
// that takes a target file!
bassert (targetFile != File::nonexistent);
bassert (targetFile != File::nonexistent ());
if (temporaryFile.exists())
{