Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Write optional deconstructor code for more rigorous memory tests #370

Open
tkoenig1 opened this issue Jun 6, 2020 · 4 comments
Open

Write optional deconstructor code for more rigorous memory tests #370

tkoenig1 opened this issue Jun 6, 2020 · 4 comments

Comments

@tkoenig1
Copy link

tkoenig1 commented Jun 6, 2020

I managed to get the first test to run under valgrind. This was a non-openmp version.

valgrind --leak-check=full src/CovidSim "/home/tkoenig/covid-bin/src/CovidSim" "/c:1" "/BM:bmp" "/PP:/home/tkoenig/covid-sim/tests/uk-input/pre-params.txt" "/P:/home/tkoenig/covid-sim/tests/uk-input/input-noint-params.txt" "/O:/home/tkoenig/covid-bin/tests/uk-output/st-results-noint" "/D:/home/tkoenig/covid-bin/tests/uk-output/pop.txt" "/M:/home/tkoenig/covid-bin/tests/uk-output/st-pop.bin" "/A:/home/tkoenig/covid-sim/tests/uk-input/admin-params.txt" "/S:/home/tkoenig/covid-bin/tests/uk-output/st-network.bin" "/R:1.1" "98798150" "729101" "17389101" "4797132"

Here is the report total report; the memory leaks reported at the bottom are relevant.

==113380== Memcheck, a memory error detector
==113380== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==113380== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==113380== Command: src/CovidSim /home/tkoenig/covid-bin/src/CovidSim /c:1 /BM:bmp /PP:/home/tkoenig/covid-sim/tests/uk-input/pre-params.txt /P:/home/tkoenig/covid-sim/tests/uk-input/input-noint-params.txt /O:/home/tkoenig/covid-bin/tests/uk-output/st-results-noint /D:/home/tkoenig/covid-bin/tests/uk-output/pop.txt /M:/home/tkoenig/covid-bin/tests/uk-output/st-pop.bin /A:/home/tkoenig/covid-sim/tests/uk-input/admin-params.txt /S:/home/tkoenig/covid-bin/tests/uk-output/st-network.bin /R:1.1 98798150 729101 17389101 4797132
==113380== 
sizeof(int)=4 sizeof(long)=8 sizeof(float)=4 sizeof(double)=8 sizeof(unsigned short int)=2 sizeof(int *)=8
Param=/home/tkoenig/covid-sim/tests/uk-input/input-noint-params.txt
Out=/home/tkoenig/covid-bin/tests/uk-output/st-results-noint
Dens=/home/tkoenig/covid-bin/tests/uk-output/pop.txt
Bitmap Format = *.bmp
Using 1 threads
Thread 0 initialised
Update step = 0.250000
Sampling step = 1.000000
Updates per sample=4
TimeStepsPerDay=4.000000
==113380== Warning: set address range perms: large range [0x15f60040, 0x56557e40) (undefined)
==113380== Warning: set address range perms: large range [0x15f60028, 0x56557e58) (noaccess)
Using 2 administrative units
Parameters read
Scanning population density file
==113380== Warning: set address range perms: large range [0x15f60040, 0x3430dbc0) (undefined)
Adjusted bounding box = (-5.4, 51.375)- (-2.4, 53.475)
Number of cells = 1120 (40 x 28)
Population size = 3100000 
Number of microcells = 90720
Bitmap width = 180
Bitmap height = 192
Coords xmcell=564.719 m   ymcell = 926.107 m
Density file contains 15849180 datapoints.
36869 valid microcells read from density file.
==113380== Warning: set address range perms: large range [0x15f60028, 0x3430dbd8) (noaccess)
Binary density file should contain 36869 microcells.
Saving population density file with NC=36869...
Population files read.
Number of hosts assigned = 3100000
Number of cells with non-zero population = 590
Number of microcells with non-zero population = 33897
==113380== Warning: set address range perms: large range [0x15f60040, 0x2c80e000) (defined)
sizeof(Person)=122
Cells assigned
Household sizes assigned to 3100000 people
Ages/households assigned      
Checking cells...
Allocating place/age groups...
Configuring places...
[0:1647 378691] [1:68 68490.9] [2:10 31107.3] [3:100297 1.43223e+06] Places assigned
Allocated cell and host memory
Assigned hosts to cells
==113380== Warning: set address range perms: large range [0x2c810040, 0x4fed2000) (defined)
==113380== Warning: set address range perms: large range [0x59d10040, 0x7d3d2000) (defined)
==113380== Warning: set address range perms: large range [0x7d3e0040, 0xa0aa2000) (defined)
==113380== Warning: set address range perms: large range [0xa0ab0040, 0xc4172000) (defined)
==113380== Warning: set address range perms: large range [0xc4180040, 0xe7842000) (defined)
Initialising places...
Assigning people to places....
Adjusting place weights (Capacity=379298 Demand=378470  Av place size=230.296)
Allocating people to place type 0
378470 hosts assigned to placetype 0
Adjusting place weights (Capacity=67996 Demand=68433  Av place size=999.941)
Allocating people to place type 1
68433 hosts assigned to placetype 1
Adjusting place weights (Capacity=33280 Demand=30970  Av place size=3328)
Allocating people to place type 2
30766 hosts assigned to placetype 2
Adjusting place weights (Capacity=1429786 Demand=1413254  Av place size=14.2555)
Allocating people to place type 3
1413254 hosts assigned to placetype 3
3100000 saved            
Initialising groups in places
Groups initialised
Initialising kernel...
Places intialised.
Rescaled transmission coefficients by factor of 1.1
Household mean size=2.32341
Household R0=0.833932
0.224009  0.260813  0.278856  0.75697  R0 for places = 0.75697
R0 for random spatial = 0.609098
Overall R0=2.2
Mean infectious period (sampled) = 14 (56)
LocalBeta = 0.0542566
Calculated approx cell probabilities
Initialising bitmap
UTM dist horiz=10164.9 10164.9
UTM dist vert=16669.9 16669.9
UTM dist diag=19515.7 19515.7
Model configuration complete.
Model setup in 2342.180000 seconds
Finished InitModel.
    t=46   3033226    25788|28440    12488     58 [=3100000]  58 (0 0 0)   0.00188366    
** 0 47.000000 47.000000 | -53 / 0.0064         | 64 29026 10000 1000 -> 156250 : 1
    t=47   3024981    28396|32167    14392     64 [=3100000]  64 (0 0 0)   0.00188366    
End of run
Finished InitModel.
    t=86   1326076    255376|612155    900607     5786 [=3100000]  5786 (0 0 0)   0.00188688    
** 1 87.000000 87.000000 | -13 / 0.6227         | 6227 1020818 10000 156250 -> 156250 : 1
    t=87   1280897    243775|608474    960627     6227 [=3100000]  6227 (0 0 0)   0.00188688    
End of run
Finished InitModel.
    t=86   1261641    241623|613736    976914     6086 [=3100000]  6086 (0 0 0)   0.00188688    
** 2 87.000000 87.000000 | -13 / 0.6566         | 6566 1072077 10000 156250 -> 156250 : 1
    t=87   1220102    229322|605028    1038982     6566 [=3100000]  6566 (0 0 0)   0.00188688    
End of run
Finished InitModel.
    t=87   1225250    229392|601354    1037424     6580 [=3100000]  6580 (0 0 0)   0.00188688    
** 3 88.000000 88.000000 | -12 / 0.708  | 7080 1102813 10000 156250 -> 156250 : 1.16249
    t=88   1186855    216685|590338    1099042     7080 [=3100000]  7080 (0 0 0)   0.00188688    
End of run
Finished InitModel.
    t=87   1035919    159186|510309    1385045     9541 [=3100000]  9541 (0 0 0)   0.0021979    
** 4 88.000000 88.000000 | -12 / 1.0126         | 10126 1269399 10000 156250 -> 156250 : 1.16249
Calibration ended.
    t=719   784796    0|0    2293224     21980 [=3100000]  21980 (0 0 0)   0.0021979              
End of run
extinct=0 (720)
Extinction in 0 out of 1 runs
Model ran in 5170.080000 seconds
Model finished
==113380== 
==113380== HEAP SUMMARY:
==113380==     in use at exit: 3,470,103,544 bytes in 315,670 blocks
==113380==   total heap usage: 326,534 allocs, 10,864 frees, 5,118,806,024 bytes allocated
==113380== 
==113380== 2,360 bytes in 1 blocks are possibly lost in loss record 6 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D2F7: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1076)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 4,008 (8 direct, 4,000 indirect) bytes in 1 blocks are definitely lost in loss record 8 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003C927: SetupPopulation(char*, char*, char*) (SetupModel.cpp:963)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 7,080 bytes in 3 blocks are possibly lost in loss record 10 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D30F: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1077)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 14,472 bytes in 6 blocks are possibly lost in loss record 11 of 55
==113380==    at 0x4086E7C: calloc (vg_replace_malloc.c:762)
==113380==    by 0x10039533: StratifyPlaces() [clone ._omp_fn.1] (SetupModel.cpp:2365)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003C2C7: StratifyPlaces() [clone .part.3] (SetupModel.cpp:2340)
==113380==    by 0x10045373: StratifyPlaces (SetupModel.cpp:402)
==113380==    by 0x10045373: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:314)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 16,400 bytes in 4 blocks are possibly lost in loss record 12 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D2DF: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1075)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 142,092 bytes in 35,523 blocks are definitely lost in loss record 18 of 55
==113380==    at 0x4086E7C: calloc (vg_replace_malloc.c:762)
==113380==    by 0x10039683: StratifyPlaces() [clone ._omp_fn.1] (SetupModel.cpp:2386)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003C2C7: StratifyPlaces() [clone .part.3] (SetupModel.cpp:2340)
==113380==    by 0x10045373: StratifyPlaces (SetupModel.cpp:402)
==113380==    by 0x10045373: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:314)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 267,068 bytes in 14,560 blocks are definitely lost in loss record 25 of 55
==113380==    at 0x4086E7C: calloc (vg_replace_malloc.c:762)
==113380==    by 0x10039943: StratifyPlaces() [clone ._omp_fn.1] (SetupModel.cpp:2386)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003C2C7: StratifyPlaces() [clone .part.3] (SetupModel.cpp:2340)
==113380==    by 0x10045373: StratifyPlaces (SetupModel.cpp:402)
==113380==    by 0x10045373: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:314)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 312,092 bytes in 9,976 blocks are definitely lost in loss record 28 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x100380B3: SetupPopulation(char*, char*, char*) [clone ._omp_fn.2] (SetupModel.cpp:1411)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003EF6F: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1282)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 409,164 bytes in 50,084 blocks are definitely lost in loss record 33 of 55
==113380==    at 0x4086E7C: calloc (vg_replace_malloc.c:762)
==113380==    by 0x100396A3: StratifyPlaces() [clone ._omp_fn.1] (SetupModel.cpp:2387)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003C2C7: StratifyPlaces() [clone .part.3] (SetupModel.cpp:2340)
==113380==    by 0x10045373: StratifyPlaces (SetupModel.cpp:402)
==113380==    by 0x10045373: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:314)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 1,043,120 bytes in 442 blocks are definitely lost in loss record 37 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D30F: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1077)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 1,047,840 bytes in 444 blocks are definitely lost in loss record 38 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D2F7: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1076)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 1,775,300 bytes in 433 blocks are definitely lost in loss record 39 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D2DF: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1075)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 3,749,392 bytes in 50,077 blocks are definitely lost in loss record 40 of 55
==113380==    at 0x4086E7C: calloc (vg_replace_malloc.c:762)
==113380==    by 0x10039533: StratifyPlaces() [clone ._omp_fn.1] (SetupModel.cpp:2365)
==113380==    by 0x40D62BB: GOMP_parallel (parallel.c:171)
==113380==    by 0x1003C2C7: StratifyPlaces() [clone .part.3] (SetupModel.cpp:2340)
==113380==    by 0x10045373: StratifyPlaces (SetupModel.cpp:402)
==113380==    by 0x10045373: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:314)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== 12,400,000 bytes in 1 blocks are possibly lost in loss record 46 of 55
==113380==    at 0x408425C: malloc (vg_replace_malloc.c:309)
==113380==    by 0x1003D1D3: SetupPopulation(char*, char*, char*) (SetupModel.cpp:1055)
==113380==    by 0x10043BCF: SetupModel(char*, char*, char*, char*) (SetupModel.cpp:216)
==113380==    by 0x100027D7: main (CovidSim.cpp:372)
==113380== 
==113380== LEAK SUMMARY:
==113380==    definitely lost: 8,746,076 bytes in 161,540 blocks
==113380==    indirectly lost: 4,000 bytes in 1 blocks
==113380==      possibly lost: 12,440,312 bytes in 15 blocks
==113380==    still reachable: 3,448,913,156 bytes in 154,114 blocks
==113380==         suppressed: 0 bytes in 0 blocks
==113380== Reachable blocks (those to which a pointer was found) are not shown.
==113380== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==113380== 
==113380== For counts of detected and suppressed errors, rerun with: -v
==113380== ERROR SUMMARY: 14 errors from 14 contexts (suppressed: 0 from 0)
@tkoenig1
Copy link
Author

tkoenig1 commented Jun 6, 2020

Here is the output from gcc's static analyzer from a compilation:

/home/tkoenig/covid-sim/src/Bitmap.cpp:315:1: warning: leak of '<unknown>' [CWE-401] [-Wanalyzer-malloc-leak]
  315 | }
      | ^
  'void InitBMHead()': events 1-21
    |
    |  224 |  int i, j, k, k2, value;
    |      |  ^~~
    |      |  |
    |      |  (1) allocated here
    |......
    |  230 |  if (!(bmf = (unsigned char*)calloc((size_t)k + k2, sizeof(unsigned char))))
    |      |  ~~
    |      |  |
    |      |  (2) assuming '<unknown>' is non-NULL
    |      |  (3) following 'false' branch...
    |  231 |   ERR_CRITICAL("Unable to allocate storage for bitmap\n");
    |  232 |  bmPixels = &(bmf[k2]);
    |      |  ~~~~~~~~
    |      |  |
    |      |  (4) ...to here
    |......
    |  250 |  for (i = 0; i < BWCOLS * 4; i++)
    |      |              ~~~~~~~~~~~~~~
    |      |                |
    |      |                (5) following 'false' branch (when 'i != 232')...
    |  251 |   bmh->palette[i][3] = 0;
    |      |   ~~~
    |      |   |
    |      |   (6) ...to here
    |  252 |  for (j = 0; j < BWCOLS; j++)
    |      |              ~~~~~~~~~~
    |      |                |
    |      |                (7) following 'false' branch (when 'j != 58')...
    |      |                (9) following 'true' branch (when 'j == 58')...
    |  253 |  {
    |  254 |   value = 255 - 255 * j / (BWCOLS - 1);
    |      |   ~~~~~
    |      |   |
    |      |   (8) ...to here
    |......
    |  270 |  if (!(bmPopulation = (int32_t*)malloc(bmh->imagesize * sizeof(int32_t))))
    |      |  ~~
    |      |  |
    |      |  (10) ...to here
    |      |  (11) following 'false' branch...
    |  271 |   ERR_CRITICAL("Unable to allocate storage for bitmap\n");
    |  272 |  if (!(bmInfected = (int32_t*)malloc(bmh->imagesize * sizeof(int32_t))))
    |      |  ~~
    |      |  |
    |      |  (12) ...to here
    |      |  (13) following 'false' branch...
    |  273 |   ERR_CRITICAL("Unable to allocate storage for bitmap\n");
    |  274 |  if (!(bmRecovered = (int32_t*)malloc(bmh->imagesize * sizeof(int32_t))))
    |      |  ~~
    |      |  |
    |      |  (14) ...to here
    |      |  (15) following 'false' branch...
    |  275 |   ERR_CRITICAL("Unable to allocate storage for bitmap\n");
    |  276 |  if (!(bmTreated = (int32_t*)malloc(bmh->imagesize * sizeof(int32_t))))
    |      |  ~~
    |      |  |
    |      |  (16) ...to here
    |      |  (17) following 'false' branch...
    |......
    |  279 |  if (P.BitmapFormat == BF_PNG)
    |      |  ~~
    |      |  |
    |      |  (18) ...to here
    |......
    |  313 |  if (!(mkdir(buf, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH))) fprintf(stderr, "Unable to create directory %s\n", buf);
    |      |  ~~
    |      |  |
    |      |  (19) following 'false' branch...
    |  314 | #endif
    |  315 | }
    |      | ~ 
    |      | |
    |      | (20) ...to here
    |      | (21) '<unknown>' leaks here; was allocated at (1)
    |


/home/tkoenig/covid-sim/src/SetupModel.cpp:1683:1: warning: leak of '<unknown>' [CWE-401] [-Wanalyzer-malloc-leak]
 1683 | }
      | ^
  'void SetupAirports()': events 1-9
    |
    | 1512 |  if (!(P.DoAirports && P.HotelPlaceType < P.PlaceTypeNum)) ERR_CRITICAL("DoAirports || HotelPlaceType not set\n");
    |      |  ^~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |  |   |                   |
    |      |  |   |                   (2) ...to here
    |      |  |   (3) following 'false' branch...
    |      |  (1) following 'false' branch...
    | 1513 | 
    | 1514 |  P.KernelType = P.AirportKernelType;
    |      |  ~
    |      |  |
    |      |  (4) ...to here
    |      |  (5) allocated here
    |......
    | 1520 |  if (!(Airports[0].DestMcells = (IndexList*)calloc(P.NMCP * NNA, sizeof(IndexList)))) ERR_CRITICAL("Unable to allocate airport storage\n");
    |      |  ~~
    |      |  |
    |      |  (6) assuming '<unknown>' is non-NULL
    |      |  (7) following 'false' branch...
    | 1521 |  if (!(base = (IndexList*)calloc(P.NMCP * NNA, sizeof(IndexList)))) ERR_CRITICAL("Unable to allocate airport storage\n");
    |      |  ~~
    |      |  |
    |      |  (8) ...to here
    |      |  (9) following 'false' branch (when 'base' is non-NULL)...
    |
  'void SetupAirports()': event 10
    |
    |cc1plus:
    | (10): ...to here
    |
  'void SetupAirports()': events 11-15
    |
    | 1571 |  for (int i = 0; i < P.Nairports; i++)
    |      |                  ~~^~~~~~~~~~~~~
    |      |                    |
    |      |                    (11) following 'true' branch...
    |......
    | 1577 | #pragma omp parallel for private(k,l,t,tmin) schedule(static,10000) default(none) \
    |      |         ~~~         
    |      |         |
    |      |         (12) ...to here
    |......
    | 1675 |  for (int i = 0; i < P.Nplace[P.HotelPlaceType]; i++) Places[P.HotelPlaceType][i].n = 0;
    |      |                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    |      |                    |
    |      |                    (13) following 'true' branch...
    | 1676 |  P.KernelType = P.MoveKernelType;
    |      |  ~                  
    |      |  |
    |      |  (14) ...to here
    |......
    | 1683 | }
    |      | ~                   
    |      | |
    |      | (15) '<unknown>' leaks here; was allocated at (5)
    |

... so these might be places to look for for leaked memory.

@jieyouxu
Copy link

jieyouxu commented Jun 7, 2020

It could be easier to read if you surround the log output with three backticks (`), for example:

```
the log content in question
```

Which will format the log content in fixed-width font instead of the default sans-serif font.

@tkoenig1
Copy link
Author

tkoenig1 commented Jun 7, 2020

It could be easier to read if you surround the log output with three backticks (`), for example:

Done, thanks for the tip.

@weshinsley
Copy link
Collaborator

So, at the moment, we get all the memory needed at initialisation; the main loop code in the middle doesn't have any malloc/new type calls, and then we're not doing a deconstruct at the end, because it's (much) quicker to just exit if there's nothing else to do.

It would be good (and quite boring!) if we also wrote some deconstructor code at the end that, so we could more easily detect any "unexpected" memory problems, and turn it on for some test runs.

@weshinsley weshinsley changed the title Memory leaks Write optional deconstructor code for more rigorous memory tests Jun 15, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants