c++ - 关于不要返回局部对象的引用或指针的疑问 ? //c primer中文版 201页

查看:159
本文介绍了c++ - 关于不要返回局部对象的引用或指针的疑问 ? //c primer中文版 201页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

1问题

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

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

我在essential c++看到了这样的代码,函数可以返回局部变量的char 指针 和const char *,这是为什么呢?(在win7 + vs2010下编译通过并可以运行打印"num_sequence")

#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里的内容的。

3 希望有人帮我解释下,标题1 的内容。

解决方案

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*你都是不能修改的,因为其指向的是一个常量字符串。强行修改会在运行时报错。

这篇关于c++ - 关于不要返回局部对象的引用或指针的疑问 ? //c primer中文版 201页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆