gpt4 book ai didi

c++ - 在线程中运行递归合并排序方法时发生 EXC_BAD_ACCESS 错误

转载 作者:行者123 更新时间:2023-11-30 03:52:12 25 4
gpt4 key购买 nike

我在使用 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++ - 在线程中运行递归合并排序方法时发生 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856660/

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