d*******n 发帖数: 524 | 1 程序在后面。
我的理解是“Hello World”是内存里一段const char[],
foo2之所以不行是因为除了foo2这个function之后,这个char 的array就被release了。
但foo1难道不是相同的情况吗?为什么
cout << foo1() <
这一行就可以输出Hello World呢?
请指教
#include
#include
using namespace std;
char* foo1();
const string& foo2();
int main(int argc, _TCHAR* argv[])
{
int i;
cout << foo1() <
cout << foo2() << endl;
cin >> i;
return 0;
}
char* foo1()
{
return "Hello World";
}
const string& foo2()
{
return "Hello World";
} |
X****r 发帖数: 3557 | 2 你理解得不对。
string literal,比如你这里的"Hello World",是一直存在不会被释放的。
foo2之所以不行是因为它返回了一个string临时变量的引用。
你把这个临时变量显式地写出来就知道了:
const string& foo2()
{
string temp("Hello World");
return temp;
}
这里临时变量temp在foo函数结束之后就释放了,但是main里还在继续使用它。
了。
【在 d*******n 的大作中提到】 : 程序在后面。 : 我的理解是“Hello World”是内存里一段const char[], : foo2之所以不行是因为除了foo2这个function之后,这个char 的array就被release了。 : 但foo1难道不是相同的情况吗?为什么 : cout << foo1() <: 这一行就可以输出Hello World呢? : 请指教 : #include : #include : using namespace std;
|
d*******n 发帖数: 524 | 3 所以临时的东西是那个reference,而char array本身却并不临时?
那么所有的在程序中提到的这种字符串(想这个"Hello World")都是一直存在
于内存中直到程序结束?
那么他们被放在内存中的什么地方呢?肯定不是stack里面,由于不是dynamic
memory allocation,那也不是heap上。
【在 X****r 的大作中提到】 : 你理解得不对。 : string literal,比如你这里的"Hello World",是一直存在不会被释放的。 : foo2之所以不行是因为它返回了一个string临时变量的引用。 : 你把这个临时变量显式地写出来就知道了: : const string& foo2() : { : string temp("Hello World"); : return temp; : } : 这里临时变量temp在foo函数结束之后就释放了,但是main里还在继续使用它。
|
X****r 发帖数: 3557 | 4 While it really depends on individual compilers,
string literals are usually stored in a const data segment.
【在 d*******n 的大作中提到】 : 所以临时的东西是那个reference,而char array本身却并不临时? : 那么所有的在程序中提到的这种字符串(想这个"Hello World")都是一直存在 : 于内存中直到程序结束? : 那么他们被放在内存中的什么地方呢?肯定不是stack里面,由于不是dynamic : memory allocation,那也不是heap上。
|