uCalc API Version: 2.1.3-preview.2 Released: 6/16/2026
Warning
uCalc API Preview Release Notice:The documentation describes the intended behavior of the API. The current preview build contains incomplete features, unoptimized performance, and is subject to breaking changes.
Release
Method
Product:
Class:
Explicitly frees all memory and resources associated with a Transformer instance, including all of its defined rules, tokens, and match results.
Syntax
Parameters
Return
void
This method does not return a value.
Remarks
💾 Core Concept: Freeing Engine Resources
The Release() method explicitly destroys a Transformer instance and deallocates all of its associated resources, including rules, tokens, passes, match lists, and the internal text buffer. It is the primary mechanism for manual memory management within the uCalc ecosystem.
🤔 Why is Release() Necessary? (Comparative Analysis)
uCalc's memory model is different from standard garbage-collected or native memory management, making Release() essential.
vs. C# Garbage Collection (GC): In C#, when a
Transformerobject variable goes out of scope, the C# Garbage Collector only reclaims the memory for the handle (the C# wrapper object). The underlying C++ engine instance, which holds the bulk of the data, remains in memory.Release()is the signal to destroy that underlying engine instance. Without it, you will have a memory leak.vs. C++
delete: uCalc uses its own internal memory manager for performance and object recycling. ATransformerhandle is not a raw C++ pointer that can be managed withdelete. CallingRelease()ensures the object is returned to uCalc's internal pool correctly.
⚙️ Manual vs. Automatic Release (Best Practice)
While Release() provides manual control, the recommended approach is to use language-specific scoping mechanisms that call Release() for you automatically:
- C# / VB.NET: Create the
Transformerinstance within ausingblock. The instance will be automatically released when the block is exited. - C++: For stack-allocated objects, call Owned() to enable RAII. The
Transformerinstance is released when its destructor is called at the end of its scope.
Use Release() explicitly only when the lifetime of the Transformer object is not tied to a specific lexical scope.
Release() vs. Active(false) vs. Reset()
It is crucial to choose the correct method for your needs:
| Method | Purpose | Effect on Object |
|---|---|---|
Release() (This Method) | Destroy the object | The object is destroyed and its memory is freed. The handle becomes invalid. |
| Rule.Active(false) | Temporarily disable a rule | The rule's definition is preserved in memory but is ignored during matching. |
| Reset() | Clear the object's state | The Transformer object remains alive but is reset to its initial state (no text, no rules). |
Idempotency Note: Release() is idempotent. Calling it multiple times on the same (already released) handle is safe and has no effect.
Examples
Pass()
using uCalcSoftware;
var uc = new uCalc();
var FruitsXML =
"""
""";
var t = uc.NewTransformer();
t.Text = FruitsXML;
var Pass1 = t.Pass();
var Pass2 = t.Pass();
Pass1.Description = "Pass A";
Pass1.FromTo("Fruits", "ListOfFruits");
Pass1.FromTo(" ", "{name} ");
Pass2.Description = "Pass B";
Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *");
Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **");
t.Transform();
Console.WriteLine("All passes");
Console.WriteLine("----------");
Console.WriteLine(t.Text);
Console.WriteLine(t.Pass(0).Description);
Console.WriteLine(t.Pass(1).Description);
Console.WriteLine($"Pass count: {t.PassCount()}");
Console.WriteLine("");
t.Str(FruitsXML);
Pass2.Release();
t.Transform();
Console.WriteLine("Pass1 only (Pass2 released)");
Console.WriteLine("---------------------------");
Console.WriteLine(t.Text);
All passes
----------
<ListOfFruits>
<Fruit>Apple *</Fruit>
<Fruit>Banana **</Fruit>
<Fruit>Orange *</Fruit>
<Fruit>Grapes **</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango *</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon **</Fruit>
</ListOfFruits>
Pass A
Pass B
Pass count: 2
Pass1 only (Pass2 released)
---------------------------
<ListOfFruits>
<Fruit>Apple</Fruit>
<Fruit>Banana</Fruit>
<Fruit>Orange</Fruit>
<Fruit>Grapes</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon</Fruit>
</ListOfFruits> using uCalcSoftware; var uc = new uCalc(); var FruitsXML = """ <Fruits> <Fruit CommonName='Apple' ScientificName='Malus domestica' /> <Fruit CommonName='Banana' ScientificName='Musa acuminata' /> <Fruit CommonName='Orange' ScientificName='Citrus × sinensis' /> <Fruit CommonName='Grapes' ScientificName='Vitis vinifera' /> <Fruit CommonName='Strawberry' ScientificName='Fragaria × ananassa' /> <Fruit CommonName='Pineapple' ScientificName='Ananas comosus' /> <Fruit CommonName='Mango' ScientificName='Mangifera indica' /> <Fruit CommonName='Blueberry' ScientificName='Vaccinium corymbosum' /> <Fruit CommonName='Rambutan' ScientificName='Nephelium lappaceum' /> <Fruit CommonName='Salak (Snake Fruit)' ScientificName='Salacca zalacca' /> <Fruit CommonName='Jabuticaba' ScientificName='Plinia cauliflora' /> <Fruit CommonName='Watermelon' ScientificName='Citrullus lanatus' /> </Fruits> """; var t = uc.NewTransformer(); t.Text = FruitsXML; var Pass1 = t.Pass(); var Pass2 = t.Pass(); Pass1.Description = "Pass A"; Pass1.FromTo("Fruits", "ListOfFruits"); Pass1.FromTo("<Fruit CommonName={@str:name} ScientificName={@str:sci_name} />", "<Fruit>{name}</Fruit>"); Pass2.Description = "Pass B"; Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *"); Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **"); t.Transform(); Console.WriteLine("All passes"); Console.WriteLine("----------"); Console.WriteLine(t.Text); Console.WriteLine(t.Pass(0).Description); Console.WriteLine(t.Pass(1).Description); Console.WriteLine($"Pass count: {t.PassCount()}"); Console.WriteLine(""); t.Str(FruitsXML); Pass2.Release(); t.Transform(); Console.WriteLine("Pass1 only (Pass2 released)"); Console.WriteLine("---------------------------"); Console.WriteLine(t.Text);
#include
#include "uCalc.h"
using namespace std;
using namespace uCalcSoftware;
int main() {
uCalc uc;
auto FruitsXML =
R"(
)";
auto t = uc.NewTransformer();
t.Text(FruitsXML);
auto Pass1 = t.Pass();
auto Pass2 = t.Pass();
Pass1.Description("Pass A");
Pass1.FromTo("Fruits", "ListOfFruits");
Pass1.FromTo(" ", "{name} ");
Pass2.Description("Pass B");
Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *");
Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **");
t.Transform();
cout << "All passes" << endl;
cout << "----------" << endl;
cout << t.Text() << endl;
cout << t.Pass(0).Description() << endl;
cout << t.Pass(1).Description() << endl;
cout << "Pass count: " << t.PassCount() << endl;
cout << "" << endl;
t.Str(FruitsXML);
Pass2.Release();
t.Transform();
cout << "Pass1 only (Pass2 released)" << endl;
cout << "---------------------------" << endl;
cout << t.Text() << endl;
}
All passes
----------
<ListOfFruits>
<Fruit>Apple *</Fruit>
<Fruit>Banana **</Fruit>
<Fruit>Orange *</Fruit>
<Fruit>Grapes **</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango *</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon **</Fruit>
</ListOfFruits>
Pass A
Pass B
Pass count: 2
Pass1 only (Pass2 released)
---------------------------
<ListOfFruits>
<Fruit>Apple</Fruit>
<Fruit>Banana</Fruit>
<Fruit>Orange</Fruit>
<Fruit>Grapes</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon</Fruit>
</ListOfFruits> #include <iostream> #include "uCalc.h" using namespace std; using namespace uCalcSoftware; int main() { uCalc uc; auto FruitsXML = R"( <Fruits> <Fruit CommonName='Apple' ScientificName='Malus domestica' /> <Fruit CommonName='Banana' ScientificName='Musa acuminata' /> <Fruit CommonName='Orange' ScientificName='Citrus × sinensis' /> <Fruit CommonName='Grapes' ScientificName='Vitis vinifera' /> <Fruit CommonName='Strawberry' ScientificName='Fragaria × ananassa' /> <Fruit CommonName='Pineapple' ScientificName='Ananas comosus' /> <Fruit CommonName='Mango' ScientificName='Mangifera indica' /> <Fruit CommonName='Blueberry' ScientificName='Vaccinium corymbosum' /> <Fruit CommonName='Rambutan' ScientificName='Nephelium lappaceum' /> <Fruit CommonName='Salak (Snake Fruit)' ScientificName='Salacca zalacca' /> <Fruit CommonName='Jabuticaba' ScientificName='Plinia cauliflora' /> <Fruit CommonName='Watermelon' ScientificName='Citrullus lanatus' /> </Fruits> )"; auto t = uc.NewTransformer(); t.Text(FruitsXML); auto Pass1 = t.Pass(); auto Pass2 = t.Pass(); Pass1.Description("Pass A"); Pass1.FromTo("Fruits", "ListOfFruits"); Pass1.FromTo("<Fruit CommonName={@str:name} ScientificName={@str:sci_name} />", "<Fruit>{name}</Fruit>"); Pass2.Description("Pass B"); Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *"); Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **"); t.Transform(); cout << "All passes" << endl; cout << "----------" << endl; cout << t.Text() << endl; cout << t.Pass(0).Description() << endl; cout << t.Pass(1).Description() << endl; cout << "Pass count: " << t.PassCount() << endl; cout << "" << endl; t.Str(FruitsXML); Pass2.Release(); t.Transform(); cout << "Pass1 only (Pass2 released)" << endl; cout << "---------------------------" << endl; cout << t.Text() << endl; }
Imports System
Imports uCalcSoftware
Public Module Program
Public Sub Main()
Dim uc As New uCalc()
Dim FruitsXML =
"
"
Dim t = uc.NewTransformer()
t.Text = FruitsXML
Dim Pass1 = t.Pass()
Dim Pass2 = t.Pass()
Pass1.Description = "Pass A"
Pass1.FromTo("Fruits", "ListOfFruits")
Pass1.FromTo(" ", "{name} ")
Pass2.Description = "Pass B"
Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *")
Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **")
t.Transform()
Console.WriteLine("All passes")
Console.WriteLine("----------")
Console.WriteLine(t.Text)
Console.WriteLine(t.Pass(0).Description)
Console.WriteLine(t.Pass(1).Description)
Console.WriteLine($"Pass count: {t.PassCount()}")
Console.WriteLine("")
t.Str(FruitsXML)
Pass2.Release()
t.Transform()
Console.WriteLine("Pass1 only (Pass2 released)")
Console.WriteLine("---------------------------")
Console.WriteLine(t.Text)
End Sub
End Module
All passes
----------
<ListOfFruits>
<Fruit>Apple *</Fruit>
<Fruit>Banana **</Fruit>
<Fruit>Orange *</Fruit>
<Fruit>Grapes **</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango *</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon **</Fruit>
</ListOfFruits>
Pass A
Pass B
Pass count: 2
Pass1 only (Pass2 released)
---------------------------
<ListOfFruits>
<Fruit>Apple</Fruit>
<Fruit>Banana</Fruit>
<Fruit>Orange</Fruit>
<Fruit>Grapes</Fruit>
<Fruit>Strawberry</Fruit>
<Fruit>Pineapple</Fruit>
<Fruit>Mango</Fruit>
<Fruit>Blueberry</Fruit>
<Fruit>Rambutan</Fruit>
<Fruit>Salak (Snake Fruit)</Fruit>
<Fruit>Jabuticaba</Fruit>
<Fruit>Watermelon</Fruit>
</ListOfFruits> Imports System Imports uCalcSoftware Public Module Program Public Sub Main() Dim uc As New uCalc() Dim FruitsXML = " <Fruits> <Fruit CommonName='Apple' ScientificName='Malus domestica' /> <Fruit CommonName='Banana' ScientificName='Musa acuminata' /> <Fruit CommonName='Orange' ScientificName='Citrus × sinensis' /> <Fruit CommonName='Grapes' ScientificName='Vitis vinifera' /> <Fruit CommonName='Strawberry' ScientificName='Fragaria × ananassa' /> <Fruit CommonName='Pineapple' ScientificName='Ananas comosus' /> <Fruit CommonName='Mango' ScientificName='Mangifera indica' /> <Fruit CommonName='Blueberry' ScientificName='Vaccinium corymbosum' /> <Fruit CommonName='Rambutan' ScientificName='Nephelium lappaceum' /> <Fruit CommonName='Salak (Snake Fruit)' ScientificName='Salacca zalacca' /> <Fruit CommonName='Jabuticaba' ScientificName='Plinia cauliflora' /> <Fruit CommonName='Watermelon' ScientificName='Citrullus lanatus' /> </Fruits> " Dim t = uc.NewTransformer() t.Text = FruitsXML Dim Pass1 = t.Pass() Dim Pass2 = t.Pass() Pass1.Description = "Pass A" Pass1.FromTo("Fruits", "ListOfFruits") Pass1.FromTo("<Fruit CommonName={@str:name} ScientificName={@str:sci_name} />", "<Fruit>{name}</Fruit>") Pass2.Description = "Pass B" Pass2.FromTo("{Fruit: Apple | Orange | Mango }", "{Fruit} *") Pass2.FromTo("{Fruit: Banana | Grapes | Watermelon }", "{Fruit} **") t.Transform() Console.WriteLine("All passes") Console.WriteLine("----------") Console.WriteLine(t.Text) Console.WriteLine(t.Pass(0).Description) Console.WriteLine(t.Pass(1).Description) Console.WriteLine($"Pass count: {t.PassCount()}") Console.WriteLine("") t.Str(FruitsXML) Pass2.Release() t.Transform() Console.WriteLine("Pass1 only (Pass2 released)") Console.WriteLine("---------------------------") Console.WriteLine(t.Text) End Sub End Module