gpt4 book ai didi

c++ - 我的内存泄漏在哪里?

转载 作者:行者123 更新时间:2023-11-28 00:53:56 26 4
gpt4 key购买 nike

因此,我编写了自己的 ArrayList(也称为 C++ 中的 vector )实现,并在其中包含了几种算法。现在我的合并排序方法似乎在泄漏内存,但我逐行检查了代码,跟踪分配到删除,一切似乎都很顺利!

我应该注意,我为 ArrayList 中的每个方法都有一个测试脚本,但我遇到了崩溃,然后我尝试删除合并排序测试,然后繁荣,没有更多的崩溃。但有趣的是......它并不总是崩溃,它有时会起作用,但也会使其他人崩溃。

两种方法的代码如下:

快速变量枚举:

array = 支持 arrayList 的数组

size = 一个 int,用于跟踪数组的大小。

sorted = 一个 bool 值,指示列表是否已排序

/**
* Runs merge sort on this ArrayList<T>. Interface function to the central,
* recursive, merge sort function.
*
* Runs in O(nlogn) time. However it consumes extra memory.
*/
template<class T>
void ArrayList<T>::mergeSort() {

T* temp = mergeSort(array, size);
delete [] array;
array = temp;
sorted = true;
}

/**
* Runs merge sort on the passed in array. Recursive.
*
* Runs in O(nlogn) time. However it consumes extra memory.
*
* @param array the array to sort.
* @param arraySize the size of the array that is to be sorted.
* @return the sorted array.
*/
template<class T>
T* ArrayList<T>::mergeSort(T* array, int arraySize) {

T* returnArray;

//If the array is more than one element.
if (arraySize > 1) {

int size1 = arraySize / 2;
int size2 = arraySize - size1;

T* array1;
T* array2;

//Recurse.
array1 = mergeSort(array, size1);
array2 = mergeSort(array + size1, size2);

//Allocate memory for return array.
returnArray = new T[arraySize];

//Loop through all elements in returnArray.
int i = 0, j = 0, k = 0;
while (i < arraySize) {

//Place the lesser of two elements in returnArray.
if ((array1[j] <= array2[k] && j < size1)
|| k == size2) {

returnArray[i] = array1[j];
j++;
}
else {

returnArray[i] = array2[k];
k++;
}

i++;
}

//Free the memory allocated in the recursive calls.

delete [] array1;
delete [] array2;
array1 = 0;
array2 = 0;
}
//If one element is in the passed array.
else {

//Allocate memory for new array, and assign passed value to it.
//This is done so delete can be called in the calling function.
returnArray = new T[1];
returnArray[0] = array[0];
}

return returnArray;
}

最佳答案

您正在访问 array1 [ j ]在检查它是否为 j < size1 之前.如果j >= size1然后访问该索引处的数组是非法的。它可能不会总是崩溃,这取决于堆中事物的内存布局,但有时会崩溃。您的支票应该是这样的:

if (((j < size1) && (array1[j] <= array2[k])) || k == size2) {
...

关于c++ - 我的内存泄漏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com