IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ 临时对象的销毁及避坑 -> 正文阅读

[C++知识库]C++ 临时对象的销毁及避坑

C++里临时对象在创建语句执行完毕之后就立即被销毁。


一 代码验证

假设有如下代码,

#include <iostream>

class A
{
public:
    ~A()
    {
        std::cout << "XXX\n";
    };
};


int main(void)
{
    A();
    std::cout << "YYY\n";

    return 0;
}

类A的析构函数加了打印,main函数里先创建类A的临时对象,然后打印别的语句,最后编译运行,结果如下,
在这里插入图片描述
可以看出,当临时对象的创建语句执行完毕后就会被销毁。


二 避坑

假如我们有如下代码,

#include <iostream>
#include <vector>


class A
{
public:

    std::vector<int> getVector(void)
    {
        return m_vData;
    }

    void addData(int data)
    {
        m_vData.push_back(data);
    }


private:
    std::vector<int> m_vData;
};


int main(void)
{
    A a;
    a.addData(100);
    a.addData(200);
    a.addData(300);

    auto it = a.getVector().cbegin(); // 坑

    for (; it != a.getVector().cend(); ++it)
    {
        std::cout << *it << "\n";
    }

    return 0;
}

类A的getVector()方法会返回m_vData的一份拷贝,在main函数里,我们使用a.getVector().cbegin()来获取迭代器,然后遍历,最后打印如下,
在这里插入图片描述
很明显与预期不符,问题就出在这条语句,

auto it = a.getVector().cbegin()

a.getVector()会产生一个vector临时对象,然后获取这个临时对象的迭代器来赋值给it,这样当这条语句执行完毕后,临时对象已经被销毁,这样it指向的内存空间已经失效,就会造成打印异常。

解决办法有2种:

  • 使用一个具名的vector变量来承接a.getVector()的返回值,

    int main(void)
    {
        A a;
        a.addData(100);
        a.addData(200);
        a.addData(300);
    
        std::vector<int> ret = a.getVector();
    
        auto it = ret.cbegin();
    
        for (; it != ret.cend(); ++it)
        {
            std::cout << *it << "\n";
        }
    
        return 0;
    }
    
  • 让getVector()返回m_vData的引用(指针也可以),这样前面main函数里的调用方式就可以正常运行了

    class A
    {
    public:
    
        const std::vector<int>& getVector(void)
        {
            return m_vData;
        }
    
        void addData(int data)
        {
            m_vData.push_back(data);
        }
    
    
    private:
        std::vector<int> m_vData;
    };
    

最后打印如下,
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 11:05:17  更:2021-07-16 11:05:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 7:47:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码