Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;代码有时运行,但有时会挂起或抛出异常 我写了一个C++程序,它合并排序的子数组,但我的问题是,当我使用VisualStudio运行代码时,它有时运行得非常好,但是其他时候它不(我会说它运行没有问题~ 40%的时间),当它没有按预期运行时,它要么挂在某个点上,要么抛出异常,有时异常是堆损坏,有时它只是说(myapp).exe触发了断点。另外,我遇到的另一个问题是,当我试图删除我的动态数组时,我得到了一个错误,我得到的错误在文章的末尾,我试图删除的动态数组在合并子数组代码段的末尾被注释掉 void MergeSubArrays(int arr[], int size, int R) { int lP, rP, lLimit, rLimit, p = 0, c = 0, rC = R; int* temp = new int[size]; bool breakOut = false; while (R < size) { lP = 0, rP = R, lLimit = R, rLimit = R * 2; while (p < size) { while (lP < lLimit && rP < rLimit) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } } while (lP < lLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < rLimit) { temp[p] = arr[rP]; p++; rP++; } for (;c < p;c++) { arr[c] = temp[c]; } if ((rLimit + 2 * R) <= size) { rLimit += (2 * R); lLimit += (2 * R); lP += R; rP += R; } else { break; breakOut = true; } if (breakOut) break; } if (breakOut) break; p = 0; c = 0; R += R; } if (rLimit < size) { p = 0; c = 0; lP = 0; while (lP < rLimit && rP < size) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } while (lP < rLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < size) { temp[p] = arr[rP]; p++; rP++; } for (;c < size;c++) { arr[c] = temp[c]; } } } /*delete[] temp; <-- this results in a breakpoint with a code snippet that I'll show at the end of the post*/ }_C++ - Fatal编程技术网

C++;代码有时运行,但有时会挂起或抛出异常 我写了一个C++程序,它合并排序的子数组,但我的问题是,当我使用VisualStudio运行代码时,它有时运行得非常好,但是其他时候它不(我会说它运行没有问题~ 40%的时间),当它没有按预期运行时,它要么挂在某个点上,要么抛出异常,有时异常是堆损坏,有时它只是说(myapp).exe触发了断点。另外,我遇到的另一个问题是,当我试图删除我的动态数组时,我得到了一个错误,我得到的错误在文章的末尾,我试图删除的动态数组在合并子数组代码段的末尾被注释掉 void MergeSubArrays(int arr[], int size, int R) { int lP, rP, lLimit, rLimit, p = 0, c = 0, rC = R; int* temp = new int[size]; bool breakOut = false; while (R < size) { lP = 0, rP = R, lLimit = R, rLimit = R * 2; while (p < size) { while (lP < lLimit && rP < rLimit) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } } while (lP < lLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < rLimit) { temp[p] = arr[rP]; p++; rP++; } for (;c < p;c++) { arr[c] = temp[c]; } if ((rLimit + 2 * R) <= size) { rLimit += (2 * R); lLimit += (2 * R); lP += R; rP += R; } else { break; breakOut = true; } if (breakOut) break; } if (breakOut) break; p = 0; c = 0; R += R; } if (rLimit < size) { p = 0; c = 0; lP = 0; while (lP < rLimit && rP < size) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } while (lP < rLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < size) { temp[p] = arr[rP]; p++; rP++; } for (;c < size;c++) { arr[c] = temp[c]; } } } /*delete[] temp; <-- this results in a breakpoint with a code snippet that I'll show at the end of the post*/ }

C++;代码有时运行,但有时会挂起或抛出异常 我写了一个C++程序,它合并排序的子数组,但我的问题是,当我使用VisualStudio运行代码时,它有时运行得非常好,但是其他时候它不(我会说它运行没有问题~ 40%的时间),当它没有按预期运行时,它要么挂在某个点上,要么抛出异常,有时异常是堆损坏,有时它只是说(myapp).exe触发了断点。另外,我遇到的另一个问题是,当我试图删除我的动态数组时,我得到了一个错误,我得到的错误在文章的末尾,我试图删除的动态数组在合并子数组代码段的末尾被注释掉 void MergeSubArrays(int arr[], int size, int R) { int lP, rP, lLimit, rLimit, p = 0, c = 0, rC = R; int* temp = new int[size]; bool breakOut = false; while (R < size) { lP = 0, rP = R, lLimit = R, rLimit = R * 2; while (p < size) { while (lP < lLimit && rP < rLimit) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } } while (lP < lLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < rLimit) { temp[p] = arr[rP]; p++; rP++; } for (;c < p;c++) { arr[c] = temp[c]; } if ((rLimit + 2 * R) <= size) { rLimit += (2 * R); lLimit += (2 * R); lP += R; rP += R; } else { break; breakOut = true; } if (breakOut) break; } if (breakOut) break; p = 0; c = 0; R += R; } if (rLimit < size) { p = 0; c = 0; lP = 0; while (lP < rLimit && rP < size) { if (arr[lP] < arr[rP]) { temp[p] = arr[lP]; p++; lP++; } else { temp[p] = arr[rP]; p++; rP++; } while (lP < rLimit) { temp[p] = arr[lP]; p++; lP++; } while (rP < size) { temp[p] = arr[rP]; p++; rP++; } for (;c < size;c++) { arr[c] = temp[c]; } } } /*delete[] temp; <-- this results in a breakpoint with a code snippet that I'll show at the end of the post*/ },c++,C++,编辑:修复了问题,谢谢你的帮助 通常情况下,它有时可能会运行,而其他情况则不会归因于内存泄漏。有时你可能会很幸运,泄漏不会损坏其他数据,但通常会损坏其他数据 尝试使用std库中带有错误捕获的预构建列表类,查看它遇到了什么错误,然后修复它。最后一件事是,如果这不起作用,请检查编译器选项,因为这可能会禁用错误检查 编辑:最常见的原因是无效写入,而不是泄漏。谢谢你的评论。你写的东西已经超过了temp的末尾。将temp更改为std::vector,并使用at()而不是[]查找何处。使用向量的时间。。。这

编辑:修复了问题,谢谢你的帮助

通常情况下,它有时可能会运行,而其他情况则不会归因于内存泄漏。有时你可能会很幸运,泄漏不会损坏其他数据,但通常会损坏其他数据

尝试使用std库中带有错误捕获的预构建列表类,查看它遇到了什么错误,然后修复它。最后一件事是,如果这不起作用,请检查编译器选项,因为这可能会禁用错误检查


编辑:最常见的原因是无效写入,而不是泄漏。谢谢你的评论。

你写的东西已经超过了
temp
的末尾。将
temp
更改为
std::vector
,并使用
at()
而不是
[]
查找何处。使用向量的时间。。。这看起来更像是C语言而不是C++语言。泄漏不太可能损坏数据。你的意思是执行无效写入吗?
void SortIntoSubArrays(int arr[], int begin, int end) {
    if (begin < end) {
        int j, key, pos;
        for (int i = begin;i < end;i++) {
            j = i - 1;
            key = arr[i];
            pos = BinarySearch(arr, key, begin, j);

            while (j >= pos) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }
}
int main() {
    int size = 15;
    int* arr = new int[size];
    arr[0] = 5; arr[1] = 2; arr[2] = 10; arr[3] = 1; arr[4] = 8; arr[5] = 3; arr[6] = 12; arr[7] = 4; 
    arr[8] = 7; arr[9] = 20; arr[10] = 15; arr[11] = 17;  arr[12] = 5; arr[13] = 40; arr[14] = 45;
    int R = 3;
    for (int i = 0; i < size;i += R) {
        if (i + R <= size) InsertionSort2(arr, i, i + R);
        else SortIntoSubArrays(arr, i, size);
    }
    MergeSubArrays(arr, 15, R);
    for (int i = 0;i < size;i++) {
        cout << arr[i] << endl;
    }
}
CRT_SECURITYCRITICAL_ATTRIBUTE
void __CRTDECL operator delete(void* const block) noexcept
{
    #ifdef _DEBUG
    _free_dbg(block, _UNKNOWN_BLOCK);
    #else
    free(block);
    #endif
}