C 字符串堆栈分配

c string stack allocation

本文关键字:分配 堆栈 字符串      更新时间:2023-10-16

>假设我们定义了某个类,它有一个指向 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 有一个有效的指针,要么是默认的"一些 str", 或者调用方在函数中创建的任何内容。

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

您的代码无法返回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

诸如"some str2"之类的字符串文字不存储在堆栈中,而是主要存储在某种只读内存中。但是,指向它们的指针存储在堆栈中。