【问题标题】:Dev C++ crashing on running large memory programDev C++ 在运行大内存程序时崩溃
【发布时间】:2014-01-02 22:21:51
【问题描述】:

我是编程新手。我在 Windows 7(x86) 上使用 Dev C++。我正在尝试运行以下程序。我认为没有逻辑错误导致程序崩溃。程序是在在线法官(Codeforces)上运行。 我应该怎么做才能成功执行程序?

我的解决方案:

#include<iostream>

using namespace std;

int main()
{
    int n,i,j;
    long long a[100000],b[100000],sort[200000],temp;
    char aresult[100000],bresult[100000];
    char*sortpoint[200000];

    cin>>n;

    for(i=0;i<n;i++)
    {
        cin>>a[i]>>b[i];

        aresult[i]='0';
        bresult[i]='0';
    }

    for(i=0;i<(n/2);i++)
    {
        aresult[i]='1';
        bresult[i]='1';
    }

    i=0;
    j=n+i;

    for(i=0;i<n;i++)
    {
        sort[i]=a[i];
        sort[j]=b[i];

        sortpoint[i]=&aresult[i];
        sortpoint[j]=&bresult[i];

        j++;
    }

    for(i=0;i<(2*n);i++)
    {
        for(j=0;j<(2*n)-i-1;j++)
        {
            if(sort[j]>sort[j+1])
            {
                temp=sort[j];
                sort[j]=sort[j+1];
                sort[j+1]=temp;
            }
        }
    }

    for(i=0;i<n;i++)
    {
        *sortpoint[i]='1';
    }

    cout<<aresult<<endl<<bresult;   

}

【问题讨论】:

  • 不要分配堆栈上的所有内容。这很可能太多了。
  • 您介意发布指向确切问题的链接吗?
  • 您是否尝试过运行调试器来确认没有逻辑问题?
  • 由于堆栈大小的限制,您不能定义如此大的静态数组。改为使用动态数组。例如a = new long long[100000] 或使用vector&lt;long long&gt; a(100000)

标签: c++ crash


【解决方案1】:

您在堆栈上分配了太多。线程的默认堆栈大小为 1MB,除非它被显式更改,并且您的数组超过了该大小。

相反,将数据移到堆上。例如:L

long long *a=new long long[100000];

您只限制了我的进程的可用虚拟内存,对于 32 位 Windows 应用程序,这将是 2GB。

【讨论】:

  • 由于他使用 C++,并且他的目标是静态大小的数组,std::vector&lt;long long&gt; 将同样有效。 std::vector&lt;long long&gt; a(100000);
  • @ShaneHsu - 是的,没错。
【解决方案2】:

您正在经历一种称为堆栈溢出的状态,因此程序正在崩溃。主要是因为有大数组元素的静态分配。由于在您的程序中 n 是一个变量值,并且在循环测试条件中是必需的,因此我建议您动态分配内存。这将节省大量被浪费的内存。为此,您可以使用 new 运算符。如果您想要一种更好的方式来组织数据,您甚至可以使用链表。但这会增加程序的复杂性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2019-01-15
    • 2015-07-20
    • 1970-01-01
    • 2010-10-28
    相关资源
    最近更新 更多