关于栈内存的小疑点
关于栈内存的小问题
char * Func1(void)
{
char str[] = “hello world”; // str 的内存位于栈上
...
return str; // 将导致错误
}
CString Func2(void)
{
CString str = "hello world ";
...
return str;
}
Func1 和 Func2 有什么区别?不都是栈内存吗?
------解决方案--------------------
因为func2返回的是一个对象,这个对象拥有一个字符串
func1返回的是一个指针,指针所指向的内容已经无效了
------解决方案--------------------
呃,CString其实一个指针,指向了堆内存,还正确实现了深拷贝。
------解决方案--------------------
两个的临时变量在退出函数时都被释放了。只不过第一个还是在原地址访问,当然出错;而第二个是把原来的内容拷贝到另外一个地方去了,所以你还能访问。
------解决方案--------------------
返回值返回的是返回内容的拷贝
你返回指针, 返回的时候把指针拷贝一下返回给你,指针的拷贝还是一个指针, 和没被拷贝的指针变量指向的是同一个东西, 都是指向栈中的那块地址, 当出了函数之后, 就会发生访问没有的东西, 当然出错了
如果你返回的不是指针而是一个实在的对象,返回值也会把你return的东西拷贝一下返回出函数栈空间, 此时,这个拷贝的东西就是你需要要的东西了, 他不会再去栈中查找内存数据
char * Func1(void)
{
char str[] = “hello world”; // str 的内存位于栈上
...
return str; // 将导致错误
}
CString Func2(void)
{
CString str = "hello world ";
...
return str;
}
Func1 和 Func2 有什么区别?不都是栈内存吗?
------解决方案--------------------
因为func2返回的是一个对象,这个对象拥有一个字符串
func1返回的是一个指针,指针所指向的内容已经无效了
------解决方案--------------------
呃,CString其实一个指针,指向了堆内存,还正确实现了深拷贝。
------解决方案--------------------
两个的临时变量在退出函数时都被释放了。只不过第一个还是在原地址访问,当然出错;而第二个是把原来的内容拷贝到另外一个地方去了,所以你还能访问。
------解决方案--------------------
返回值返回的是返回内容的拷贝
你返回指针, 返回的时候把指针拷贝一下返回给你,指针的拷贝还是一个指针, 和没被拷贝的指针变量指向的是同一个东西, 都是指向栈中的那块地址, 当出了函数之后, 就会发生访问没有的东西, 当然出错了
如果你返回的不是指针而是一个实在的对象,返回值也会把你return的东西拷贝一下返回出函数栈空间, 此时,这个拷贝的东西就是你需要要的东西了, 他不会再去栈中查找内存数据