是以下未定义的行为?

时间:2011-10-07 05:37:46

标签: c++ undefined-behavior

以下是内联(定义的内部头文件)静态成员函数。文字字符串“MyClass”是否始终保证在静态内存中?如果没有,这不会在堆栈中返回指针吗?

const char * className()
{
return "MyClass";
}

编辑:

这个怎么样?

const RWCString& className()
{
return "MyClass";
}

RWCString是一个字符串类,它有一个带const char*的隐式构造函数。 http://www.roguewave.com/portals/0/products/sourcepro/docs/11/html/toolsref/rwcstring.html

2 个答案:

答案 0 :(得分:5)

不。这是完全定义的。字符串不在堆栈中。它在全球记忆中。所以它返回的指针是有效的。 (甚至更好:你宣布它为const

答案 1 :(得分:5)

第一个例子:

const char * className()
{
  return "MyClass";
}

很好。 "MyClass"char const[8]类型的文字,其生命周期在您的代码被调用之前开始,在代码完成后结束,因此没有问题。

然而,第二个例子不起作用。

const RWCString& className()
{
  return "MyClass";
}

它要求在函数内构造类型RWCString的对象,以便能够返回对它的引用。但是,无法通过引用返回在函数中构建为局部变量或临时变量的内容,因此您将获得未定义的行为(如果它编译)。

你可以非常简单地把它变成一个“好”的功能:

const RWCString& className()
{
  static RWCString const N = "MyClass";
  return N;
}

这里我创建了一个本地静态对象N,它将在第一次调用函数时构造。因为static它的生命周期延伸到调用之后所以可以返回对它的引用。

编辑:正如史蒂夫指出的那样,临时更适合这里的局部变量。