函数内部的string literals:分配在堆栈还是堆中?

 

问:

在下面的代码中,我在一个地方(标记为ONE)将一个String literals赋值给类的一个私有域,并且在将来的某个时刻访问它(标记为TWO)。在这种情况下,代码会引用一个dangling指针吗?因为这段代码非常短可能还不足以暴露问题?

#include <iostream>
using namespace std;
   
   
   
   
    
     
   
   
class MemoryLeak 
       
{ 
       
private: 
       
    char *s; 
       
public: 
       
    MemoryLeak() {}
   
   
    
     
   
   
    void store() 
       
    { 
       
        s = "Storing a string"; // ONE 
       
    }
    char *retrieve() 
       
    { 
       
        return s; 
       
    } 
       
};
   
   
    
     
   
   
int main() 
       
{ 
       
    MemoryLeak *obj = new MemoryLeak(); 
       
    obj->store(); 
       
    cout << obj->retrieve() << endl; // TWO 
       
    delete obj; 
       
    return 0; 
       
} 
       

我应该将变量”s”声明为一个字符数组而不是一个指针吗?我本打算使用std::string,但是我只是好奇。

 

答:

编译器在编译代码时,将会把String literals存储到二进制文件的initialized datatext(code)段中,而不是位于堆或堆栈中。因此你可以使用这个指针,但是注意不要修改String literals,如果你那样做了可能会导致程序崩溃,因为修改String literals会导致未定义的行为(ISO C++: 2.13.4 /2)。为了向后兼容C,标准允许将一个String literals强制转换为一个char*,因此如果你确实需要,可以执行转换。

如果你希望将String literals视为一个常量,那么你应该将成员类型声明为const char*

 

后记:

原文地址:
http://stackoverflow.com/questions/173681/string-literals-inside-functions-automatic-variables-or-allocated-in-heap

Stackoverflow是一个针对开发者的协作式可编辑的Q&A网站。

int s = sizeof('a');   //在这里s equals Four!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值