是否可以通过增加编译器为数组提供的内存量来避免分段错误错误?

问题描述 投票:0回答:2

我知道编译器为创建数组提供的内存量是有限制的。如何配置编译器以增加此内存。如果可能的话,有哪些优点和缺点? 我使用linux和g++编译器。

c++
2个回答
1
投票

如果您谈论的是堆栈大小,则取决于您使用的系统。既然你说在 Linux 上,你可以从你的程序中改变堆栈大小。但请注意,这不能移植到其他操作系统。要更改堆栈大小,您可以使用此函数(或多或少从here复制)

#include <sys/resource.h>

using namespace std;

//Increases the Stacksize to at least minStackSize
bool setStack(rlim_t minStackSize)
{
    struct rlimit rl;
    int result; 

    result = getrlimit(RLIMIT_STACK, &rl);

    //If we got an answer
    if (result == 0)
    {
        //Check if Stack is smaller than needed
        if (rl.rlim_cur < minStackSize)
        {
            //Increase Stacksize
            rl.rlim_cur = minStackSize;
            result = setrlimit(RLIMIT_STACK, &rl);

            if (result == 0)
                return true;
            else
                return false;
        }
        else
            return true;
    }
    else
        return false; 
} 

请注意,这是一个简约的函数,您可能想添加自己的错误消息,而不是仅仅返回 TRUE/FALSE。

增加堆栈大小的优点是,如果您尝试在堆栈上放入超出堆栈大小允许的变量,您的程序不会崩溃。缺点是这个空间总是被你的程序占用,不管它是否实际使用。 (但是您的操作系统可能会欺骗一些)


1
投票

我将尝试回答你,即使问题非常不具体(请指定你的编译器,如果你指的是堆栈)。

现在我假设您指的是堆栈,并且您正在使用带有 Visual Studio 的 Linux 或 Windows。

Linux

在Linux上,您可以使用系统调用setrlimit。然后,您将在代码中以编程方式设置堆栈,如 this Stack Overflow 线程中。

Windows

在装有 Visual Studio 的 Windows 上,您可以使用编译器选项

/F
/STACK
,有关更多信息,请访问 此 MSDN 文档页面


在某些情况下,您也可以考虑使用堆而不是堆栈,this线程中有一些很好的比较。然后,您将使用动态内存分配,并且不会关心堆栈大小(但是,您会关心数组的一些不同方法)。

如果您还有其他问题,请指定您的编译器...

© www.soinside.com 2019 - 2024. All rights reserved.