EXC_BAD_ACCESS线程中运行递归合并排序方法时出错
EXC_BAD_ACCESS error occurring when running recursive merge sort method in a thread
我在xCode中遇到C++代码问题。我试过调试,但无法修复。我知道这大约是当我的 mergeSort() 方法调用我的 mergeNumbers() 方法的时候。我知道这不是方法本身,因为我在没有线程的情况下运行了该方法,并且它工作得很好。当我尝试在线程中使用它时,我遇到了问题。
我尝试在线查找,我能找到的最接近我的问题的是,这可能是我调用已删除或不再存在的对象的方法的问题。我将不胜感激对此的任何反馈。谢谢。
#include <cstdlib>
#include <pthread.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
void openFile();
void* mergeSort(void *threadid);
void mergeNumbers(int *myArray, int minCount, int maxCount, int midCount);
void mergeSort(int *myArray, int minCount, int maxCount);
void trial2();
int array1[500000];
int array2[500000];
int array3[250000];
int array4[250000];
int array5[250000];
int array6[250000];
int main(int argc, char *argv[]) {
openFile();
//trial1();
trial2();
return 0;
}
void trial2(){
int i, t1;
void *status;
pthread_t thread1, thread2, thread3, thread4;
t1 = pthread_create(&thread1, NULL, mergeSort, (void *)i);
pthread_join(thread1, &status);
}
void* mergeSort(void *threadid){
long tid = (long)threadid;
cout << "I am performing the Merge Sort" << endl;
mergeSort(array6, 0, 249999);
pthread_exit(NULL);
}
void mergeSort(int *myArray, int minCount, int maxCount)
{
int midCount;
if (minCount < maxCount)
{
midCount=(minCount+maxCount)/2;
mergeSort(myArray,minCount,midCount);
mergeSort(myArray,midCount + 1,maxCount);
mergeNumbers(myArray, minCount, maxCount, midCount);
}
return;
}
void mergeNumbers(int *myArray, int minCount, int maxCount, int midCount)
{
int newArray[maxCount + 1];
int arrayNum = minCount;
int num1 = minCount;
int num2 = midCount + 1;
while (num1 <= midCount && num2 <= maxCount)
{
if (myArray[num1] < myArray[num2])
{
newArray[arrayNum] = myArray[num1];
num1++;
arrayNum++;
}
else
{
newArray[arrayNum] = myArray[num2];
num2++;
arrayNum++;
}
}
while (num1 <= midCount)
{
newArray[arrayNum] = myArray[num1];
num1++;
arrayNum++;
}
while (num2 <= maxCount)
{
newArray[arrayNum] = myArray[num2];
num2++;
arrayNum++;
}
for (num1 = minCount; num1 < arrayNum; num1++)
{
myArray[num1] = newArray[num1];
}
}
您的问题源于这一行:
int newArray[maxCount + 1];
您正在尝试在堆栈上分配 ~250000 int
秒(在大多数 32 位平台上,它将占用 ~ 1MB
的内存)。您的线程堆栈可能无法执行此操作。
顺便说一下,你不应该这样做 - 创建运行时已知的大小数组应该通过堆内存分配来完成:
int* newArray = (int*)malloc(sizeof(int) * (maxCount + 1));
在函数的末尾:
free(newArray);
然而,最好的解决方案是使用 std::vector:
相关文章:
- 使用C++程序合并排序没有得到正确的输出
- 用于合并排序的合并函数
- 合并排序不排序自创建数组类 c++
- 仅在大型阵列上出现合并排序分段错误
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- C++合并排序可视化工具
- 没有输出的合并排序我做错了什么?
- 字符串上的合并排序上的 Seg 错误
- 使用向量在 c++ 中合并排序实现
- 我无法让我的合并排序实现运行
- 合并链表上的排序
- 合并排序:分段错误核心转储
- 合并两个排序链表时运行时出错
- 在 C++ 中合并两个排序链表
- 合并排序中的错误计数:计数反转
- C++ 多线程 - 与线程合并排序的算法替代
- C++中合并排序算法的奇怪行为
- 合并排序没有给我任何输出
- C++ 中的合并排序
- C++:合并排序合并数组