开发者社区> 问答> 正文

关于不要返回局部对象的引用或指针的疑问 ?

1问题

c++primer说函数不能返回局部对象的指针或引用。

const string &manip()
{
    string ret;
    if(!ret.empty())
        return ret;      //错误返回局部对象的引用 
    else
       return "empty";   //错误 “empty”是一个局部临时量
 }

在essential c++看到了这样的代码,函数可以返回局部变量的char 指针 和const char *,这是为什么呢?

#include <iostream>
#include <string>
using namespace std;

    class num_sequence{
    public:
        virtual const char *what_am_i( ) const// 返回值char * 和const char*可以编译通过
        {
            return "num_sequence";
        }
    };
    int main()
    {
        num_sequence p;
        std::cout<<p.what_am_i();
    }

2进一步提问

把函数返回值有const char改为char 也可以编译通过,但不能通过char指针修改字符串的内容。



    virtual char *what_am_i( ) const//把函数返回值有const char*改为char *也可以编译通过
    {
        return "num_sequence";
    }

问题2我好像了解了,类似于char* p= “safdsaf”;也是不能通过指针修改rodata里的内容的。

展开
收起
杨冬芳 2016-05-27 16:35:59 2747 0
1 条回答
写回答
取消 提交回答
  • IT从业
    const string &manip()
    {
        string ret;
        if(!ret.empty())
            return ret;      //错误返回局部对象的引用 
        else
           return "empty";   //错误 “empty”是一个局部临时量
     }

    上面两个都是返回的临时变量(return "empty"先构建一个临时的string,再返回),在函数调用结束的时候就**析构了。所以是不安全的。编译是可以通过的,但是对于返回的结果,因为已经析构,所以是不应该使用的。

         virtual const char *what_am_i( ) const// 返回值char * 和const char*可以编译通过
            {
                return "num_sequence";
            }

    上面返回的是一个指针,指向字符串"num_sequence",这个字符串是在全局静态区,是一直存在的,不是临时的,所以没有问题

    对于问题2

    实际上是不论返回的是char*还是const char*你都是不能修改的,因为其指向的是一个常量字符串。强行修改会在运行时报错。

    2019-07-17 19:18:14
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载