2017-04-21 94 views
2

这可能是一个愚蠢的问题,但我很难在网上找到关于它的东西。可以局部变量分配吗?

我知道operator new如果分配内存失败会抛出bad_alloc exception,但是局部变量分配会发生什么?

想象我有一个系统,如果没有更多的可用内存,并在程序执行类似:

void do_something(){ 
int a = 0; 
} 

会发生什么?如何分配“a”所需的空间?它可以扔?

我的问题,从看到类似这样的地方代码:

void do_something() noexcept { 
    // some local variables being allocated 
} 

这让我想知道之间没有关系,除了和本地内存分配。另外,为了让事情变得更加混乱,我看到this这让我想知道实际发生内存分配的时间...

+1

我想这会导致一个StackOverflow?尽管我从来没有碰到过我。 – Carcigenicate

+0

我假设程序只会崩溃,因为它不能添加内存,所以它只会抛出一个错误? –

+1

使用现代操作系统时,由于虚拟内存的原因,这种情况不会发生。 @CJHutchison – Sridharan

回答

2

我不认为do_something(){ int a = 0; }可以抛出。有作为分配给“一”存储没有这样的事情,在大多数情况下,这将是在处理器的寄存器,你不知道,如果它甚至会被存储在内存中或不..

关于

void do_something() noexcept { 

这只是告诉编译器您的函数do_something不能抛出C++异常,因此编译器可能会做出一些假设并可能进行一些额外的优化。

+0

在你的第一种情况下,这将被优化,因为没有副作用,它从来没有使用过。如果它被使用,你不能认为它会进入一个寄存器。 – Donnie

+0

没有优化的每个变量都有存储,这很容易防止。我认为局部变量属于块范围类别,因此具有*自动存储*。真正的问题是自动存储分配是可以抛出还是失败。 – luk32

+0

'void do_something(){std :: vector foo(1000000000000000LL); }'可以抛出并且'foo'是一个自动对象。 – NathanOliver

0

自动变量保存在栈上(不必是,但我从来没有听说过一个编译器,实现据我所知,其他方式)。 由于堆栈是在运行时分配的,因此程序不会抛出任何alloc错误(因为它已经分配了..对吧?)。

当然,在使用该局部变量时,可能会发生错误,即物理/操作系统级别可能会有内存问题。尽管在这种情况下,适当的信号将被抛出,而不是一个例外。

+1

你可以有一个'std :: vector'的实例,它是一个自动对象,但它的构造可以抛出。大量的自动物体可能会导致施工。现在,如果我们只是谈论POD对象,那是不同的故事。 – NathanOliver

0

为了跟进你说的operator new可能发生的事情,bad_alloc可以在任何动态分配的内存中发生。因此,任何指针,智能指针,许多容器等。这种分配发生在堆上。

然后有一个堆栈内存,其中有非局部变量,像局部变量一样,或者全局变量或静态变量以及其他许多变量。

若要回答你的问题,如果局部变量woul未能分配它可能意味着你用完堆栈内存,所谓的堆栈溢出。如果是这种情况,抛出异常不是一种选择。当抛出异常时,抛出的对象的内存被分配到堆栈中,因此在这种情况下它也会抛出。在这种情况下,更可能发生的情况是您的程序刚刚退出。

并且提到注释中提到的要点,是的,通常初始化类似于代码中的初始化,它被编译器优化。

相关问题