Improve alignment of its behaviour with std::shared_ptr - element_type typedef - swap, reset methods * additional reference access methods: cref() returns a const reference, synonymous with operator(). This provides a more verbose alternative to using the '()' operator when that is desired. Mnemonic: a const form of 'ref()' constCast() returns a non-const reference, regardless if the underlying object itself is a managed pointer or a const object. This is similar to ref(), but more permissive. Mnemonic: const_cast<> Using the constCast() method greatly reduces the amount of typing and reading. And since the data type is already defined via the tmp template parameter, the type deduction is automatically known. Previously, const tmp<volScalarField>& tfld; const_cast<volScalarField&>(tfld()).rename("name"); volScalarField& fld = const_cast<volScalarField&>(tfld()); Now, tfld.constCast().rename("name"); auto& fld = tfld.constCast(); -- BUG: attempts to move tmp value that may still be shared. - old code simply checked isTmp() to decide if the contents could be transfered. However, this means that the content of a shared tmp would be removed, leaving other instances without content. * movable() method checks that for a non-null temporary that is unique (not shared).
84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
|
\\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd.
|
|
-------------------------------------------------------------------------------
|
|
License
|
|
This file is part of OpenFOAM.
|
|
|
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
Application
|
|
Test-tmp
|
|
|
|
Description
|
|
Tests for possible memory leaks in the tmp (and tmp<Field> algebra).
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#include "primitiveFields.H"
|
|
|
|
using namespace Foam;
|
|
|
|
struct myScalarField : public scalarField
|
|
{
|
|
using scalarField::scalarField;
|
|
};
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
// 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;
|
|
}
|
|
|
|
{
|
|
tmp<scalarField> tfld1 = tmp<scalarField>::New(20, Zero);
|
|
|
|
Info<< "tmp refCount = " << tfld1->count() << nl;
|
|
if (tfld1.valid())
|
|
{
|
|
Info<<"tmp: " << tfld1() << nl;
|
|
}
|
|
}
|
|
|
|
{
|
|
tmp<scalarField> tfld2 =
|
|
tmp<scalarField>::NewFrom<myScalarField>(20, Zero);
|
|
|
|
Info<< "tmp refCount = " << tfld2->count() << nl;
|
|
if (tfld2.valid())
|
|
{
|
|
Info<<"tmp: " << tfld2() << nl;
|
|
}
|
|
}
|
|
|
|
Info<< "\nEnd" << endl;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|