0

我刚刚在 format_int 类的 fmt 库中发现了一些东西。它有一个 char 缓冲区成员,这样当您调用类时,堆栈空间会在调用方法的堆栈上分配。您可以从 format_int 返回一个 char * ,即使在类被破坏后它仍然有效。虽然 std::string 也有一个可能返回堆栈内存的 c_str 成员,但 std::string 的析构函数会清除此内存,迫使用户在对象生命周期内使用它。因此,相比之下,短暂的 std::string 对象会强制您在对象被破坏之前使用 c_str 的结果,而 format_int 允许您将格式化的缓冲区用于函数的其余部分。

c++ 是否保证在函数结束之前不会重用堆栈,在调用函数的生命周期内(超出 format_int 对象的生命周期)从 format_int 类中保留缓冲区是否安全?这种行为是我的编译器(MSVC)的怪癖吗?

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

4

1 回答 1

2

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

它不是。当对象被销毁时,返回的指针format_int::c_str无效。format_int这类似于std::basic_string::c_str.

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

它可以重复使用。

于 2020-09-24T19:00:53.737 回答