From eac2a41f183416e78d63df11ee444162bd9f44e1 Mon Sep 17 00:00:00 2001 From: Martin Asprusten Date: Fri, 28 Aug 2026 22:08:03 +0200 Subject: [PATCH] Use shared_ptr to avoid memory leaks --- native/salesman.cpp | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/native/salesman.cpp b/native/salesman.cpp index d62af01..c44cd76 100644 --- a/native/salesman.cpp +++ b/native/salesman.cpp @@ -1,4 +1,5 @@ #include +#include #ifdef __EMSCRIPTEN__ #include #include @@ -16,8 +17,8 @@ struct City { }; struct State{ - float* weights; - uint8_t* adjacencyMatrix; + std::shared_ptr weights; + std::shared_ptr adjacencyMatrix; float lowerBound; bool finished = false; std::vector> paths; @@ -30,7 +31,7 @@ struct SplitState { }; -double reduceWeights(float* weights, int numberOfCities) { +double reduceWeights(std::shared_ptr weights, int numberOfCities) { double totalReduced = 0; for (int row = 0; row < numberOfCities; row++) { @@ -74,7 +75,7 @@ double reduceWeights(float* weights, int numberOfCities) { return totalReduced; } -std::pair findPivotPoint(float* weights, int numberOfCities) { +std::pair findPivotPoint(std::shared_ptr weights, int numberOfCities) { int bestRow = -1; int bestColumn = -1; double bestIncrease = -1; @@ -121,7 +122,7 @@ std::pair findPivotPoint(float* weights, int numberOfCities) { return std::pair(bestRow, bestColumn); } -int getDegreeOfNode(int nodeNumber, uint8_t* adjacencyMatrix, int numberOfCities) { +int getDegreeOfNode(int nodeNumber, std::shared_ptr adjacencyMatrix, int numberOfCities) { int degree = 0; for (int column = 0; column < numberOfCities; column++) { degree += adjacencyMatrix[nodeNumber * numberOfCities + column]; @@ -130,26 +131,23 @@ int getDegreeOfNode(int nodeNumber, uint8_t* adjacencyMatrix, int numberOfCities } void multiplyAdjacencyMatrices(int** matrix, int** multiplier, int size) { - int** temporary = new int*[size]; + std::shared_ptr temporary(new int[size * size]); for (int row = 0; row < size; row++) { - temporary[row] = new int[size]; for (int column = 0; column < size; column++) { int result = 0; for (int k = 0; k < size; k++) { result += matrix[row][k] * multiplier[k][column]; } - temporary[row][column] = result; + temporary[row * size + column] = result; } } // Copy into original matrix for (int row = 0; row < size; row++) { for (int column = 0; column < size; column++) { - matrix[row][column] = temporary[row][column]; + matrix[row][column] = temporary[row * size + column]; } - delete [] temporary[row]; } - delete [] temporary; } void disallowSubloops(State &state, int pivotRow, int pivotColumn, int numberOfCities) { @@ -218,8 +216,8 @@ void disallowSubloops(State &state, int pivotRow, int pivotColumn, int numberOfC } State createNewStateOnPivot(int pivotRow, int pivotColumn, State originalState, int numberOfCities) { - uint8_t* adjacencyMatrixCopy = new uint8_t[numberOfCities * numberOfCities]; - float* weightsCopy = new float[numberOfCities * numberOfCities]; + std::shared_ptr adjacencyMatrixCopy(new uint8_t[numberOfCities * numberOfCities]); + std::shared_ptr weightsCopy(new float[numberOfCities * numberOfCities]); for (int row = 0; row < numberOfCities; row++) { for (int column = 0; column < numberOfCities; column++) { @@ -263,9 +261,6 @@ SplitState splitState(State state, int numberOfCities) { std::pair pivotPoint = findPivotPoint(state.weights, numberOfCities); if (pivotPoint.first == -1 || pivotPoint.second == -1) { splitState.wasSplittable = false; - - delete [] state.adjacencyMatrix; - delete [] state.weights; return splitState; } @@ -279,7 +274,7 @@ SplitState splitState(State state, int numberOfCities) { return splitState; } -double getActualWeight(uint8_t* adjacencyMatrix, double* weights, int numberOfCities) { +double getActualWeight(std::shared_ptr adjacencyMatrix, std::shared_ptr weights, int numberOfCities) { double totalWeight = 0; for (int row = 0; row < numberOfCities; row++) { for (int column = 0; column < numberOfCities; column++) { @@ -301,7 +296,7 @@ std::vector findShortestPath(std::vector> jsWeights) { int numberOfCities = jsWeights.size(); - double* weights = new double[numberOfCities * numberOfCities]; + std::shared_ptr weights(new double[numberOfCities * numberOfCities]); for (int row = 0; row < numberOfCities; row++) { for (int column = 0; column < numberOfCities; column++) { weights[row * numberOfCities + column] = jsWeights.at(row).at(column); @@ -314,8 +309,8 @@ std::vector findShortestPath(std::vector> jsWeights) { // Create a state State initialState; - initialState.weights = new float[numberOfCities * numberOfCities]; - initialState.adjacencyMatrix = new uint8_t[numberOfCities * numberOfCities]; + initialState.weights = std::shared_ptr(new float[numberOfCities * numberOfCities]); + initialState.adjacencyMatrix = std::shared_ptr(new uint8_t[numberOfCities * numberOfCities]); for (int row = 0; row < numberOfCities; row++) { for (int column = 0; column < numberOfCities; column++) { initialState.adjacencyMatrix[row * numberOfCities + column] = 0; @@ -328,7 +323,7 @@ std::vector findShortestPath(std::vector> jsWeights) { queue.push(initialState); double currentBest = 1e100; - uint8_t* bestAdjacenyMatrix = NULL; + std::shared_ptr bestAdjacenyMatrix = NULL; while (!queue.empty()) { State nextState = queue.top(); @@ -343,10 +338,7 @@ std::vector findShortestPath(std::vector> jsWeights) { if (actualWeight < currentBest) { currentBest = actualWeight; bestAdjacenyMatrix = nextState.adjacencyMatrix; - } else { - delete [] nextState.adjacencyMatrix; } - delete [] nextState.weights; continue; } @@ -363,9 +355,6 @@ std::vector findShortestPath(std::vector> jsWeights) { while (!queue.empty()) { State stateToDelete = queue.top(); queue.pop(); - - delete [] stateToDelete.adjacencyMatrix; - delete [] stateToDelete.weights; } std::vector path;