From ad478bc9f21e54b10b2b8a89bf55f2c23819fad0 Mon Sep 17 00:00:00 2001 From: Liam Keegan Date: Wed, 4 Mar 2026 16:20:53 +0100 Subject: [PATCH] Fix `sjA`/`sjFilter`/`sjChunks` memory leaks - these were allocated and only used locally but not deleted Only reserve and populate `P.sjAll` vectors when Solo SJ feature is requested - reduces memory use when Solo SJ feature is not requested --- source/outputSJ.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/source/outputSJ.cpp b/source/outputSJ.cpp index 8bbb3695..98b2e7c5 100644 --- a/source/outputSJ.cpp +++ b/source/outputSJ.cpp @@ -117,12 +117,15 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters& P) {//collapses junctions fr sjFilter[sjA[ii*3+1]] = sjFilter[sjA[ii*3+1]] && ( minDist >= (uint) P.outSJfilterDistToOtherSJmin[(sjA[ii*3+2]+1)/2] ); }; }; + delete[] sjA; }; - //output junctions - P.sjAll[0].reserve(allSJ.N); - P.sjAll[1].reserve(allSJ.N); - + // output junctions (only when Solo SJ feature is requested) + const bool keepSJforSolo = P.pSolo.yes && P.pSolo.featureYes[SoloFeatureTypes::SJ]; + if (keepSJforSolo) { + P.sjAll[0].reserve(allSJ.N); + P.sjAll[1].reserve(allSJ.N); + }; if (P.outFilterBySJoutStage!=1) {//output file ofstream outSJfileStream((P.outFileNamePrefix+"SJ.out.tab").c_str()); ofstream outSJtmpStream((P.outFileTmp+"SJ.start_gap.tsv").c_str()); @@ -131,8 +134,10 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters& P) {//collapses junctions fr oneSJ.junctionPointer(allSJ.data,ii); oneSJ.outputStream(outSJfileStream);//write to file outSJtmpStream << *oneSJ.start <<'\t'<< *oneSJ.gap <<'\n'; - P.sjAll[0].push_back(*oneSJ.start); - P.sjAll[1].push_back(*oneSJ.gap); + if (keepSJforSolo) { + P.sjAll[0].push_back(*oneSJ.start); + P.sjAll[1].push_back(*oneSJ.gap); + }; }; }; outSJfileStream.close(); @@ -160,4 +165,6 @@ void outputSJ(ReadAlignChunk** RAchunk, Parameters& P) {//collapses junctions fr }; }; }; + delete[] sjFilter; + delete[] sjChunks; };