- makes it easier to use in combination with various 'New' selectors, which mostly return an autoPtr. ENH: add very simple FFT test - basic sanity test that the library links properly
120 lines
2.8 KiB
C
120 lines
2.8 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | www.openfoam.com
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
Copyright (C) 2018-2020 OpenCFD Ltd.
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
|
|
|
|
Application
|
|
Test-tmp
|
|
|
|
Description
|
|
Tests for possible memory leaks in the tmp (and tmp<Field> algebra).
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "primitiveFields.H"
|
|
#include "Switch.H"
|
|
|
|
using namespace Foam;
|
|
|
|
struct myScalarField : public scalarField
|
|
{
|
|
using scalarField::scalarField;
|
|
};
|
|
|
|
|
|
template<class T>
|
|
void printInfo(const tmp<T>& item, const bool verbose = false)
|
|
{
|
|
Info<< "tmp valid:" << Switch::name(item.valid())
|
|
<< " pointer:" << Switch::name(item.is_pointer())
|
|
<< " addr: " << name(item.get())
|
|
<< " movable:" << Switch(item.movable());
|
|
|
|
if (item.valid())
|
|
{
|
|
Info<< " refCount:" << item->count();
|
|
}
|
|
Info<< nl;
|
|
|
|
if (verbose && item.valid())
|
|
{
|
|
Info<< "content: " << item() << nl;
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
// Main program:
|
|
|
|
int main()
|
|
{
|
|
scalarField f1(1000000, 1.0), f2(1000000, 2.0), f3(1000000, 3.0);
|
|
|
|
{
|
|
for (int iter=0; iter < 50; ++iter)
|
|
{
|
|
f1 = f2 + f3 + f2 + f3;
|
|
}
|
|
|
|
Info<< "f1 = " << f1 << nl;
|
|
}
|
|
|
|
{
|
|
auto tfld1 = tmp<scalarField>::New(20, Zero);
|
|
printInfo(tfld1, true);
|
|
|
|
// Hold on to the old content for a bit
|
|
|
|
tmp<scalarField> tfld2 =
|
|
tmp<scalarField>::NewFrom<myScalarField>(20, Zero);
|
|
|
|
printInfo(tfld2, true);
|
|
|
|
tfld2.clear();
|
|
|
|
Info<< "After clear : ";
|
|
printInfo(tfld2);
|
|
|
|
tfld2.cref(f1);
|
|
|
|
Info<< "Reset to const-ref : ";
|
|
printInfo(tfld2);
|
|
|
|
Info<< "Clear const-ref does not affect tmp: ";
|
|
tfld2.clear();
|
|
printInfo(tfld2);
|
|
|
|
Info<< "Reset const-ref affects tmp: ";
|
|
tfld2.reset();
|
|
printInfo(tfld2);
|
|
|
|
|
|
// Reset tfld2 from tfld1
|
|
Info<< "Fld2 : ";
|
|
printInfo(tfld2);
|
|
|
|
for (label i = 0; i < 2; ++i)
|
|
{
|
|
tfld2.reset
|
|
(
|
|
tmp<scalarField>::NewFrom<myScalarField>(4, Zero)
|
|
);
|
|
|
|
Info<< "Reset to some other tmp content : ";
|
|
printInfo(tfld2);
|
|
}
|
|
}
|
|
|
|
Info<< "\nEnd" << endl;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|