首页
学习
活动
专区
圈层
工具
发布

C++核心准则编译边学-F.43 永远不要返回指向局部对象的指针或引用

F.43: Never (directly or indirectly) return a pointer or a reference to a local object 无论直接还是间接,永远不要返回指向局部对象的指针或引用...Example, bad(反面示例) Not all examples of leaking a pointer to a local variable are that obvious: 不是所有泄漏指向局部变量指针的示例都是明显的...这个问题的稍微不同的版本是将指针放到生命周期超过指针所指向对象的容器中的情况。...参见:产生悬空指针的另一种情况是指针无效化。它可以通过类似的技术检查或防止。 译者注:指针无效化应该是指针本来指向的是一个有效对象,但后来对象被销毁而指针没有被同时清空的情况。...编译器倾向于捕捉返回指向局部变量的引用的情况,也可以在很多情况下捕捉返回指向局部变量的指针的情况。

96420

C++ this指针:用于在成员函数中指向调用该函数的对象

C++中this指针是一个指向当前对象的指针。在成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...一、定义和使用this指针 this指针是在成员函数内部定义的一个常量指针。它存储了当前对象的地址,可以通过它访问当前对象的成员变量和成员函数。...二、作为返回值的this指针 this指针可以作为返回值返回。这种情况下,返回的是指向调用该函数的对象的指针。为了实现这个功能,需要将返回类型设置为类的引用或指针类型。...person.setName("Tom").setName("Jerry"); std::cout << person.getName() << std::endl; // 输出Jerry 在setName函数内部,返回的是指向调用该函数的对象的指针...四、总结 this指针在C++中是一个非常重要的概念,可以用来访问调用该函数的对象,作为返回值返回,或者作为函数参数传递。掌握this指针的使用可以帮助我们更好地编写面向对象的程序。

1.8K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++核心准则​讨论:切勿让指针的生命周期超出其指向的对象

    Discussion: Never let a pointer outlive the object it points to 讨论:切勿让指针的生命周期超出其指向的对象 Reason(原因) To...避免极难发现的错误。 防止引用此类指针未定义、并可能导致破坏类型安全系统的行为。...返回的指针指向自由存储中的未分配内存。在执行* p时,该内存(由p指向)可能已经被重新分配。可能没有要读取的字符串,并且通过p进行的写入很容易损坏无关类型的对象。...大多数编译器已经可以警告一些简单的情况,并提供更多信息。考察从函数返回的任何可疑指针。使用容器,资源句柄和视图(例如,span已知不是资源句柄)来减少要检查的需求量。...对于初学者,请将具有析构函数的每个类视为资源句柄。

    86020

    【C++】继承 ⑥ ( 继承中的构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

    一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ 的 " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象的...指向 子类对象 定义 一个子类对象 Child child ; 定义父类的指针 , 将 指针 指向 子类对象 的地址 , 这是合法的 ; 代码示例 : // 父类对象 Parent parent...类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; 该原则的应用场景如下 : 定义函数 , 接收 父类指针...child.funChild(); // 子类对象 可以调用 父类公有函数 child.funParent(); // 将指向子类对象的指针传给接收父类指针的函数...p_parent = &parent; // 通过父类指针调用父类函数 p_parent->funParent(); // 将指向子类对象的指针传给接收父类指针的函数

    2.1K20

    【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

    一、全局函数 与 成员函数 相互转化 1、成员函数转为全局函数 - 多了一个参数 C++ 编译器 , 在编译阶段会将 C++ 类的 成员函数 转为 全局函数 , 转换时 , 会 增加一个参数到参数列表开始为止...就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员 ; 在全局函数中 , 实现两个 Student 类相加 , 接收两个 Student 引用类型的参数 , 引用相当于一级指针..., 就是返回自身对象变量 // this 是指针 , *this 是指针指向的 自身对象 return *this; } 返回 引用 , 就是返回自身对象 ; this 是指针 , *this...是指针指向的 自身对象 实际数据 , 返回引用 , 就是返回 自身对象实际数据 *this ; 四、完整代码示例 ---- 代码示例 : #include "iostream" using namespace..., 就是返回自身对象变量 // this 是指针 , *this 是指针指向的 自身对象 return *this; } // 成员函数 转为 全局函数 , 多了一个参数 Student

    1.8K20

    当谈论迭代器时,我谈些什么?

    当我初学 Python 的时候,我将迭代器理解为一种能够放在“for xxx in …”的“…”位置的东西;后来随着学习的深入,我了解到迭代器就是一种实现了迭代器协议的对象;学习 C++ 时,我了解到迭代器是一种行为和指针类似的对象...3.2 生成器 生成器(Generator)是 Python 特有的一组特殊语法,其主要目的为提供一个基于函数而不是类的迭代器定义方式。...由于迭代器本身并不是独立的数据结构,而是指向其他数据结构中的值的泛化指针,故和普通指针一样,一旦指针指向的内存发生变动,则迭代器也将随之失效。...但在 Python 中可以看到,指向 List 的迭代器并未失效,其仍然返回了 2。...故可猜想:Python 对于 List 所产生的迭代器并不跟踪指向 List 元素的指针,而仅仅跟踪的是容器的索引值。

    67840

    Python源码剖析:深度探索Cpython对象-达观数据

    是 Python 整个对象机制的核心,是 CPython 对象构造器的基石,我们来看看它的定义:因此我们看到 PyObject 的定义非常简单,就是一个引用计数和一个类型指针,所以 Python 中的任意对象都必有引用计数和类型这两个属性...综上所述,Python 底层通过 PyObject 和 PyTypeObject 完成了 C++ 所提供的对象的多态特性。...这个指针具体指向什么类型的对象我们并不知道,只能通过其内部的 ob_type 成员进行动态判断,而正是因为这个 ob_type,Python 实现了多态机制。...因为我们说 Python 中的变量都是一个 PyObject *,所以它可以指向任意的对象,因此 Python 就无法做基于类型方面的优化。...找到了之后将 a、b 作为参数传递进去,这会发生一次函数调用,会将对象维护的值拿出来进行运算,然后根据相加的结果创建一个新的对象,再返回其对应的 PyObject * 指针。

    58210

    来探寻深度学习框架的内部架构

    C/C++中 Python 扩展对象的简介 你可能知道可以借助 C/C++扩展 Python,并开发所谓的「扩展」。PyTorch 的所有繁重工作由 C/C++实现,而不是纯 Python。...PyObject_HEAD 的宏,其目标是标准化 Python 对象,并扩展至另一个结构,该结构包含一个指向类型对象的指针,以及一个带有引用计数的字段。...Python API 中有两个额外的宏,分别称为 Py_INCREF() 和 Py_DECREF(),可用于增加和减少 Python 对象的引用计数。...多实体可以借用或拥有其他对象的引用(因此引用计数被增加),而只有当引用计数达到零,Python 才会自动删除那个对象的内存。...但是,正如你从被标注的第 18 行所看到的,PyTorch 保留一个指向内部 Numpy 数组原始数据的指针,而不是复制它。

    1.4K60

    浅析 Python 的一些底层原理与 CPython

    这种技术允许 PyPy 在执行程序前先将部分代码编译成机器码,而不是像 CPython 那样逐行解释执行。...Python 的底层实现利用了 PyObject 和 PyTypeObject,从而实现了 C++ 对象的多态特性。...我们无法直接知道这个指针具体指向什么类型的对象,只能通过其内部的 ob_type 成员进行动态判断。正是因为有了 ob_type,Python 才能实现多态机制。...这会触发一次函数调用,取出对象的值进行运算,然后根据运算结果创建一个新的对象,并返回其对应的 PyObject * 指针。...前者是通过类型对象去创建的,后者是通过 Python {/} C API 创建。但对于内置类型,我们推荐使用 Python {/} C API 进行创建,它会直接解析为对应的 C 一级数据结构。

    1.8K01

    动态语言的灵活性是把双刃剑:以 Python 语言为例

    Python就是属于典型的动态语言。 动态语言的魅力在于让开发人员更好的关注需要解决的问题本身,而不是冗杂的语言规范,也不用干啥都得写个类。...运行时改变代码的行为也是非常有用,比如python的热更新,可以做到不关服务器就替换代码的逻辑,而静态语言如C++就很难做到这一点。...是的,a现在”变成”6了,但本质是a指向了6这个对象 — a不再指向5了 检验对象的唯一标准是id,id函数返回对象的地址,每个对象在都有唯一的地址。...注意: str也是不可变对象,这也是为什么在多个字符串连接操作的时候,推荐使用join而不是+ 而且python没有机制,让一个可变对象不可被修改(此处类比的是C++中的const) dict是可变对象...在静态语言如C++中,函数签名就是最好的契约。 在C++中,参数传递大约有三种形式,传值、传指针、传引用(这里不考虑右值引用)。

    1.5K70

    【小陈背八股-C++】Day02-C++核心特性面试指南:数据类型与内存管理完全解读

    但是可以修改该指针指向的对象的值。 指针常量: 指针指向一个常量(底层const),不能通过该指针来修改指向的对象的值。...但是因为指针本身不是常量,所以可以修改指针指向的对象(也就是可以指向别的地址)。...作用域:全局静态变量的作用域是整个程序,局部静态变量的作用域是声明该变量的函数或代码块内。 初始化:静态变量只被初始化一次,默认值为0。 存储位置:静态变量通常存储在全局数据区,而不是栈上。...: 前置++:直接修改对象,返回自身引用(没有临时对象) 后置++:需要保存旧值,修改对象,然后返回旧值(有临时对象) C++为了区分前后置,后置++有一个int哑元参数,调用的时候编译器会默认给后置+...面试可能提问: 为什么后置返回对象而不是引用? 因为后置为了返回旧值,创建了一个临时对象来接收,但是在函数结束时这个临时对象被销毁了,如果此时返回引用,引用的绑定目标都没有了。

    14910

    面试总结-C++

    加上extern “C”后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。...起到了隐藏的作用 在类的 static 成员变量属于整个类所拥有,对类的所以对象只有一份拷贝 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static...##### 野指针 空悬指针,不是指向null的指针,是指向垃圾内存的指针。 - 产生原因及解决办法: - 指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。...因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。...(1)操作符new返回的指针类型严格与对象匹配,而不是void; (2)C中很多以void为参数的函数可以改写为C++模板函数,而模板是支持类型检查的; (3)引入const关键字代替#define constants

    2.6K11

    C++ 面试必备:常见 C++ 面试题汇总及详细解析

    下面列举一些C和C++之间的主要区别: 面向对象编程 C++ 是一种面向对象的编程语言,而 C 不是。...指针是C++中的一种数据类型,指针变量存储了一个内存地址,该地址指向某个变量或者对象。指针可以用来访问和修改内存中的数据,同时也可以通过指针来传递参数和返回值。...C++多态是指在继承关系中,子类可以重写父类的虚函数,从而使得一个指向子类对象的指针能够调用子类的函数而不是父类的函数。其底层原理涉及到虚函数表、虚指针等概念。...操作的灵活性 数组名是一个常量指针,不能修改,而指针可以被重新赋值,指向其他对象。因此使用指针比使用数组名更加灵活,可以在运行时动态确定指向的对象。...返回值类型不同:malloc返回void类型的指针,需要进行强制类型转换,才能够使用;而new返回一个指向已分配内存空间的指针,且不需要进行强制类型转换。

    3.2K30

    python风格——动态类型

    在python中,我们编写对象接口而不是类型。我们关心的是一个对象能做什么,而不是关心它是什么。它是什么并不重要,重要的是它能做什么?...变量在表达式中出现的时候,它会被其所引用的对象的值所取代。 总结来说,python里的变量实际上就是一个void *指针(通用类型指针),这个指针指向的是对象。只不过我们在使用的时候不需要解引用。...而且这个指针指向的对象还可以改变。(这和C++的引用是完全不同的) 对象知道自己的类型,每个对象都包含一个头部信息,其中的类型标志符标记了这个对象的类型,其中的引用计数器决定何时回收这个对象。...给变量赋新值,就是改变变量所指向的对象,而不是改变原来对象。事实上,刚才的b指向的对象3是整形,而整形是不可变类型,你根本没有办法改变它。...复制一个对象方法有很多,这不是重点,重点是python的可变对象的共享引用是较为特殊,尤其是对习惯了C/C++的人而言。

    80230

    面向对象之this指针与类中的枚举类型

    this指针与类中的枚举类型 1.this指针 相信在坐的很多人,都在学Python,对于Python来说有self,类比到C++中就是this指针,那么下面一起来深入分析this指针在类中的使用!...首先来谈谈this指针的用处: (1)一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。...其次,this指针的使用: (1)在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this。 (2)当参数与成员变量名相同时,如this->n = n (不能写成n = n)。...在C++中类和结构是只有一个区别的:类的成员默认是private,而结构是public。this是类的指针,如果换成结构,那this就是结构的指针了。...而const 数据成员的确是存在的,但其含义却不是我们所期望的。

    1.6K10

    给 Python 程序员的 C++ 简易入门指南

    Python 可以根据值来得出对象的类型,而 C++ 必须先知道。Python 中可以允许赋不同类型的值给同一个对象,而 C++ 中必须保持一致,声明的时候就已经决定了这个对象的类型。...,而不是一个长度为 1 的 string。...int x, y; x = 7; y = x; Python 中表达式 y = x 表示的是 x 和 y 指向同一个对象(即同一个对象的两个名字),而在 C++ 中,表示的是将 x 的值复制到那个名字为...int fun(int x) { return x + 2; } C++ 和 Python 中的函数都是只返回一个对象。然而 Python 中有内置的可以包含多个值的对象,比如元组 tuples。...虽然在 C++ 中也可以构建类似的对象,但更倾向于使用参数来“返回”多个值 —— 类似于在 Python 中改变可变参数的方式。

    2K31
    领券