c字符串堆栈分配

时间:2014-11-13 16:04:39

标签: c++ string c++11

假设我们定义了一个类,它有一个指向char *的指针,就像这样

class MyClass
{
public:
   static MyClass* create(const char* str = "Some str")
   {
       MyClass* ptr = new MyClass();
       ptr->mStr = str; // the string is not deep copied.
       return ptr; //EDIT
   }

   const char* getStr()
   {
       return mStr;
   }

private:
   const char* mStr;
}

在代码中创建了一些对象:

MyClass* cls = MyClass::create("Some str2");

其他函数执行后代码中的其他一些我有这个:

const char* str = cls->getStr();
// str == "Some str2"

此时str有一个有效的指针,默认为" Some str",  或者调用者在函数create中传递的任何内容。

任何人都可以解释为什么str的记忆没有被改变?据我所知, 字符串是在堆栈上创建的,执行时释放了内存 离开了这个功能,虽然功能是静态的,这可能是原因吗?

2 个答案:

答案 0 :(得分:2)

您的代码无法返回MyClass动态实例:

 static MyClass* create(const char* str = "Some str")
 {
   MyClass* ptr = new MyClass();
   ptr->mStr = str;
   // return is missing here <------------
 }

所以你的代码现在表现出未定义的行为,因为没有从声明为返回UB的函数返回任何内容。

所以显而易见的解决办法就是陈述:

return ptr;

在功能结束时。

另外,你为什么诉诸char*?为什么不使用std::string

答案 1 :(得分:1)

字符串文字,例如&#34;一些str2&#34;不存储在堆栈中,但主要存储在某种只读存储器中。但是,它们的指针存储在堆栈中。