当前位置: 首页 > 知识库问答 >
问题:

临时对象的堆栈空间是否得到重用?

仲孙昊焱
2023-03-14

我刚刚在format\u int类中遇到了一个来自fmt库的东西。它有一个char缓冲区成员,这样当您调用类堆栈时,就会在调用方法的堆栈上分配空间。您可以从format_int返回一个char*,即使在类被破坏后,它仍然有效。虽然std::string还有一个c_str成员,它可能返回堆栈内存,但std::string的析构函数会清除该内存,迫使用户在对象生存期内使用它。因此,相比之下,短期std::string对象迫使您在销毁对象之前使用c\u str的结果,而format\u int允许您为函数的其余部分使用格式化缓冲区。

c是否保证堆栈在函数结束之前不会被重用,在调用函数的生存期内(超过format\u int对象的生存期)保留format\u int类的缓冲区是否安全?这是我的编译器(MSVC)的一个怪癖吗?

附言。我知道保留内存非常偷偷摸摸,我只是好奇在现实世界中编译器是否会重用堆栈,或者语言是否禁止这种行为。

共有1个答案

商璞
2023-03-14

您可以从format_int返回一个char*,即使在类被销毁后它仍然有效。

没有。当format_int对象被销毁时,从format_int::c_str返回的指针将失效。这类似于std::basic_string::c_str

临时对象的堆栈空间是否得到重用?

它可以重复使用。

 类似资料:
  • 问题内容: 内核堆栈和用户堆栈有什么区别?为什么要使用内核堆栈?如果在ISR中声明了局部变量,它将存储在哪里?每个进程都有自己的内核堆栈吗?那么,进程如何在这两个堆栈之间进行协调? 问题答案: 内核堆栈和用户堆栈有什么区别? 简而言之,除了在内存中使用不同的位置(并因此为堆栈指针寄存器使用不同的值)之外,什么也没有,而且通常使用不同的内存访问保护。也就是说,在用户模式下执行时,即使映射了内核内存(

  • 问题内容: Java内存空间(Perm空间,Space Stack,堆空间)之间有什么区别? JVM什么时候使用一个或另一个? 如果我使用Scala / Groovy / etc等,会有区别吗? 问题答案: 只是 堆空间:所有活动对象都分配在这里。 堆栈空间:在方法调用或变量实例化中存储对对象的引用以获取变量。 烫发空间:存储已加载的类信息 例如: 执行完上述行之后,内存状态将是这样。 堆:存储“

  • 问题内容: 这是声明Java数组的常用方法: 但是此数组正在使用堆空间。有没有一种方法可以使用像c ++这样的堆栈空间来声明数组? 问题答案: 一言以蔽之。 存储在堆栈中的唯一变量是基元和对象引用。在您的示例中,引用存储在堆栈上,但它引用堆上的数据。 如果由于要确保清理内存而问来自C ++的问题,请阅读有关垃圾回收的信息。简而言之,Java自动处理清理堆中的内存以及堆栈中的内存。

  • 我已经在Java和C中找到了这个问题的几个实现,但我还没有找到一个使用JavaScript的示例。这是一个相当常见的技术面试问题: 在2n空间中对堆栈进行排序。(仅使用2个堆栈对堆栈进行排序)

  • 类在程序运行的时候就会被加载,方法是在执行的时候才会被加载,如果没有任何引用了,Java自动垃圾回收,也可以用System.gc()开启回收器,但是回收器不一定会马上回收。 静态变量在类装载的时候进行创建,在整个程序结束时按序销毁; 实例变量在类实例化对象时创建,在对象销毁的时候销毁; 局部变量在局部范围内使用时创建,跳出局部范围时销毁;

  • 我正在阅读《破解编码面试》一书,遇到了一个问题:“编写一个程序,按升序对堆栈进行排序。您可以使用其他堆栈来保存项目,但不能将元素复制到任何其他数据结构(如数组)中。堆栈支持以下操作:push、pop、peek、isEmpty。” 这本书用O(n^2的时间复杂度和空间复杂度给出了答案。 但是,我偶然发现了这个博客,它使用快速排序方法在O(n log n)时间复杂性中提供了答案。 我想知道的是空间复杂