在含有return语句的循环后没有提供reutrn 语句是很危险的,大部分的编译器不能检测出漏洞
bool str_subrange(const string &str1,consst string &str2){
if(str1.size()==str2.size())
return str1==str2;
string::size_type size={min(str1.size(),str2.size())};
string::size_type i=0;
while(i!=size){
if(str1[i]!=str2[i])
return ; //error! no return value!
}
}
1.主函数main()
在cstdlib头文件内定义了两个预处理变量 分别表示程序运行的成功和失败
#include<cstdlib>
int main(){
if(some_failure)
reutrn EXIT_FAILURE;
else
return EXIT_SUCCESS;
}
2.返回非引用类型
函数的返回值用于初始化在调用函数出创建的临时对象。
在求解表达式的时候程序会创建一个没有命名的对象,这就是临时对象。
string make_plural(size_t str,const string &word>const string &ending){
return (ctr==1)?word:word+ending;
}
函数要么返回word的副本 要不返回临时string对象 它是由word和ending的相加而产生的
3.返回引用
当函数返回引用类型时,没有复制返回值 而是返回对象本身
const string &shorterString(const string &s1,const string &s2){
return s1.size()<s2.size()?s1:s2;
}
4.千万不要返回局部对象引用
const string&manip(const string& s){
string ret=s;
return ret;
}
这个函数会在运行时出错,因为他返回了局部对象的引用。
*当函数执行完毕 字符串ret占用的空间会被释放 函数返回值指向了对于这个程序来说不再有效的内存空间
与此同时 千万不要返回指向局部变量的指针 同理!
bool str_subrange(const string &str1,consst string &str2){
if(str1.size()==str2.size())
return str1==str2;
string::size_type size={min(str1.size(),str2.size())};
string::size_type i=0;
while(i!=size){
if(str1[i]!=str2[i])
return ; //error! no return value!
}
}
1.主函数main()
在cstdlib头文件内定义了两个预处理变量 分别表示程序运行的成功和失败
#include<cstdlib>
int main(){
if(some_failure)
reutrn EXIT_FAILURE;
else
return EXIT_SUCCESS;
}
2.返回非引用类型
函数的返回值用于初始化在调用函数出创建的临时对象。
在求解表达式的时候程序会创建一个没有命名的对象,这就是临时对象。
string make_plural(size_t str,const string &word>const string &ending){
return (ctr==1)?word:word+ending;
}
函数要么返回word的副本 要不返回临时string对象 它是由word和ending的相加而产生的
3.返回引用
当函数返回引用类型时,没有复制返回值 而是返回对象本身
const string &shorterString(const string &s1,const string &s2){
return s1.size()<s2.size()?s1:s2;
}
4.千万不要返回局部对象引用
const string&manip(const string& s){
string ret=s;
return ret;
}
这个函数会在运行时出错,因为他返回了局部对象的引用。
*当函数执行完毕 字符串ret占用的空间会被释放 函数返回值指向了对于这个程序来说不再有效的内存空间
与此同时 千万不要返回指向局部变量的指针 同理!