以下代码工作正常,但为什么这是正确的代码?为什么foo()返回的临时的"c_str()"指针有效?我想,当输入bar()时,这个临时性已经被破坏了 - 但它似乎不是这样的.那么,现在我假设foo()返回的临时值将在调用bar()之后被销毁 - 这是正确的吗?为什么?
std::string foo() {
std::string out = something...;
return out;
}
void bar( const char* ccp ) {
// do something with the string..
}
bar( foo().c_str() );
Run Code Online (Sandbox Code Playgroud) 我正在调试一个相当奇怪的堆栈溢出,据说是在堆栈上分配太大的变量引起的,我想澄清以下内容.
假设我有以下功能:
void function()
{
char buffer[1 * 1024];
if( condition ) {
char buffer[1 * 1024];
doSomething( buffer, sizeof( buffer ) );
} else {
char buffer[512 * 1024];
doSomething( buffer, sizeof( buffer ) );
}
}
Run Code Online (Sandbox Code Playgroud)
我理解,它依赖于编译器,也取决于优化器决定什么,但为这些局部变量分配内存的典型策略是什么?
输入功能后是否会立即分配最坏情况(1 + 512千字节)或首先分配1千字节,然后根据条件另外分配1或512千字节?
c++ stack-overflow memory-management local-variables visual-c++
根据编译器的不同代码:
int main()
{
srand( 0 );
if( rand() ) {
char buffer[600 * 1024] = {};
printf( buffer );
} else {
char buffer[500 * 1024] = {};
printf( buffer );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当在最大堆栈大小等于1兆字节的系统上运行时,要么打印空字符串,要么在堆栈溢出时崩溃.
不同之处在于不同的编译器以不同方式分配自动存储.大多数编译器在函数start上为所有对象分配存储,因此在上面的代码中,它们分配600 + 400 = 1100千字节,这导致堆栈溢出.有些编译器更聪明,他们发现这两个数组永远不能同时访问,所以他们重用相同的内存,只分配600千字节,程序运行正常.
现在标准说(3.7/1)存储持续时间定义了存储的最小潜在寿命,然后(3.7.2/1)这些对象[具有自动持续时间]的存储持续到存在它们的块为止.
我不明白3.7/1和3.7.2/1是如何一起应用的.一个人说持续时间是最小的潜力,而另一个人明确表示持续到阻止存在.看起来根据第一种分配策略是合法的,但第二种要求只使用"重用"分配策略.
3.7/1和3.7.2/1如何共存?在最坏的情况下(第一个策略)分配比程序需要更多的内存是否合法?
C ++标准未指定临时对象的存储期限。这是CWG第1634期的主题。
根据链接的网站,此问题的状态为“草稿”,表示:
起草:尽管尚无确切的措辞,但工作组已达成非正式共识,并在暂定决议中对此进行了粗略的描述。
但是,没有明确提及针对该特定问题的共识/解决方案,我也无法在委员会站点上的其他任何地方找到它。
我猜想,一个共识是,生命周期延长的临时对象的存储期限应等于它们所绑定的参考的存储期限,但是对于非生命周期延长的临时人员而言,尚不清楚。
特别是对我来说,目前尚不清楚在块范围内的语句中创建的临时变量是否具有(自动?)存储持续时间扩展到块末尾(如在同一点声明的自动变量一样),或者是否具有存储持续时间在全表达式结束时以其(默认)生存期结束。问题说明暗示了后者的情况。
说明中是否应该包含“ 暂定解决方案 ”,如果我解释正确或不正确,是否可以在其他地方找到该问题的“ 暂定解决方案 ”?
In addition, do the major compilers currently follow this consensus, either in a documented manner or de-facto?
See also older questions:
Edit for clarification:
I am not asking about the lifetime of the temporary, that is well-specified in the …