可以局部变量分配抛出吗?

时间:2017-04-21 23:47:26

标签: c++ memory

这可能是一个愚蠢的问题,但我很难在网上找到有关它的内容。

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

想象一下,我的系统中没有更多可用内存,程序执行如下操作:

void do_something(){
 int a = 0;
}

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

我从某处看到类似的代码得到了问题:

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

让我想知道no except和本地内存分配之间的关系。另外,为了让事情更加混乱,我看到The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "DB_PROD_04" was unable to begin a distributed transaction让我想知道内存分配何时实际发生......

2 个答案:

答案 0 :(得分:2)

我不认为void do_something() noexcept { 可以投掷。没有为' a'分配存储空间,在大多数情况下这将存储在处理器寄存器中,您不知道它是否会存储在内存中。

关于

do_something

这只是告诉编译器你的函数ggtern不能抛出c ++异常,因此编译器可能做出一些假设,也许会做一些额外的优化。

答案 1 :(得分:0)

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

然后有一个堆栈内存,其中包含非动态分配的变量,如本地实例中的变量,或者任何全局变量或静态变量以及许多其他内容。

要回答你的问题,如果局部变量woul无法分配它可能意味着你的堆栈内存耗尽,这就是所谓的堆栈溢出。如果是这种情况,则抛出异常不是一种选择。抛出异常时,抛出的对象的内存在堆栈中分配,因此在这种情况下它也会抛出。在这种情况下,更有可能发生的是你的程序退出。

要提及评论中提到的要点,是的,通常编译器会对代码中的初始化进行优化。