C 字符串堆栈分配
c string stack allocation
>假设我们定义了某个类,它有一个指向 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"之类的字符串文字不存储在堆栈中,而是主要存储在某种只读内存中。但是,指向它们的指针存储在堆栈中。
相关文章:
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 巨大的内存分配:堆栈与堆
- 有效地分配堆栈对象(由函数的值返回)到堆?
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么分配堆内存比分配堆栈记忆更快
- 安全分配堆栈分配的阵列
- 附加到具有非动态分配堆栈的向量
- 是否随作用域分配和解除分配堆栈帧
- 在执行中脱离堆栈对象的范围之前,请分配堆栈对象
- 全局阵列分配 -- 堆栈或堆
- 如何使新操作员超载以分配堆栈
- 具有类作用域的动态分配堆栈内存
- 如何在 Linux 下为可执行文件分配堆栈
- 内存分配堆栈
- 成员函数内存分配堆栈或堆
- 在 c++ 中重新分配堆栈上的对象
- 防止为类和派生类分配堆栈
- 如何防止msvc++为switch语句过度分配堆栈空间?