一段在C++里经常犯错误的代码

一个类:
class C{
public:
    C(){}
    ~C(){}
public:
    string a;
    string funa()
    {
        string tmp = "1234";
        return tmp;
    }
};
外部调用类C并使用其成员:
C classc;
char *test1 = classc.a.c_str();
printf("%s\n", test1);
上述正确;如果
C classc;
char *test2 = classc.funca.c_str();
printf("%s\n", test2);
上述不正确,为什么呢?
这个是C++的特性,此类C中的成员函数funa返回的是一个内部变量,其作用域仅仅在外部调用的栈内有效,而成员变量则栈内外都会有效;也可以这样理解,针对C++成员函数的返回值,如果是内部变量的返回,需要copy一份(C里面使用strdup函数)才能持久(栈外)有效,这点在C语言里面是相通的。

一般在perl和java语言中,直接使用函数内部的返回值,无论在栈内、外都是没有错的,但是在C++里面需要注意。C语言里面,一般返回char*时需要注意外,一般返回char或者int,这样是可以的。

有些经验丰富的人也会犯这种错误哟,大部分因为各种语言的混合编程后,导致概念的混淆,当然上述的错误例子可能也会编译通过,运行起来也没有错误,但是会造成一个程序崩溃的隐患。


Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Entry

This page contains a single entry by Cnangel published on April 21, 2009 11:54 PM.

深入double array trie was the previous entry in this blog.

世界如此奇妙 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.