【问题标题】:How can I get rid of segmentation error?如何摆脱分段错误?
【发布时间】:2015-06-01 21:12:17
【问题描述】:

我的目标是找到(p个连续数的最小值)*p的最大值。这里 1

" 在抛出 'std::bad_alloc' 的实例后调用终止 什么():std::bad_alloc 此应用程序已请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队了解更多信息。”

我发现错误是因为程序试图访问不允许的内存。但我没有得到代码的哪一部分正在尝试访问未分配的内存。请帮助我。

#include <iostream>

using namespace std;

int main(){
int N=0;
cin>>N;
int **A,*B,i,j,num;
A = new int*[N];
for(i=0;i<N;i++)
    A[i] = new int[N]();
B = new int[N]();

for(i=0;i<N;i++){
    cin>>num;
    A[0][B[0]] = num;
    for(j=0;j<B[0];j++){
        A[j+1][B[j+1]] = min(A[j][B[j+1]],A[j][B[j+1]+1]);
        B[j+1]++;
    }
    B[0]++;
}
long long maxim = 0;
for(i=0;i<N;i++){
   for(j=0;j<B[i];j++){
      if(A[i][j]*(i+1) > maxim)
        maxim = A[i][j]*(i+1);
   }
}

cout<<maxim;
delete []A;
delete []B;
return 0;
}

【问题讨论】:

  • 也许 N*N 整数没有空间?毕竟,100000 * 100000 * 4 = 是 38000 MB,所以至少我的 16GB RAM 的机器无法应付。
  • 请注意,“bad_alloc”不是“使用未分配的内存”,而是“没有足够的可用内存”。
  • 对于 64 位应用和操作系统应该没问题,

标签: c++ runtime-error


【解决方案1】:

failing to allocate memory 时抛出 std::bad_alloc。

您正在尝试为 100000 * 100000 整数分配空间。那是大约 40GB 的 RAM,您可能没有。

【讨论】:

  • 你能帮我解决上述问题,减少内存的使用。任何算法...
  • 是堆栈的实现可以帮助我。如果是。那么如何。
【解决方案2】:

成为软件工程师的一部分就是学习将问题分解成更小的部分。要解决此问题,您应该首先将问题分解为最小的单位。

int main()
{
    size_t dimension = 100000;
    int** outer = new int[dimension];
    for (size_t i = 0; i < dimension; ++i) {
        outer[i] = new int[dimension];
    }
}

编译并加载到调试器中,单步执行并找到异常发生的位置。或者你可以这样写:

#include <iostream>

int main()
{
    size_t dimension = 100000;
    size_t allocated = 0;
    int** outer = new int*[dimension];
    allocated += sizeof(int*) * dimension;
    for (size_t i = 0; i < dimension; ++i) {
        try {
            outer[i] = new int[dimension];
            allocated += sizeof(int) * dimension;
        } catch (std::bad_alloc&) {
            std::cerr << "bad alloc at iteration " << i << " with " << allocated << " bytes allocated\n";
            return -1;
        }
    }
}

或者

#include <iostream>

int main()
{
    size_t dimension = 100000;
    std::cout << "Allocating outer: " << (dimension * sizeof(int*)) << " bytes\n";
    int** outer = new int[dimension];
    for (size_t i = 0; i < dimension; ++i) {
        std::cout << "Allocating outer[" << i << "] (" << (dimension * sizeof(int)) << " bytes\n";
        outer[i] = new int[dimension];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2021-09-28
    • 2019-06-07
    • 1970-01-01
    • 2017-04-04
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多