首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在c++中返回指向值类型的指针是不是一种坏做法

在C++中返回指向值类型的指针并不一定是一种坏做法,但需要谨慎使用。以下是一些相关的解释和注意事项:

  1. 指向值类型的指针:在C++中,可以使用指针来引用和操作值类型的对象。返回指向值类型的指针意味着返回一个指向该对象的内存地址的指针。
  2. 潜在问题:返回指向值类型的指针可能会导致一些问题。例如,如果返回的指针指向一个局部变量,当函数结束时,该指针将指向一个无效的内存地址,使用该指针可能导致未定义的行为。此外,如果返回的指针没有适当地释放,可能会导致内存泄漏。
  3. 解决方案:为了避免潜在的问题,可以考虑以下几种解决方案:
    • 返回对象副本:而不是返回指针,可以返回值类型对象的副本。这样可以确保返回的对象是有效的,并且不会出现内存泄漏的问题。但是,如果对象很大,返回副本可能会带来性能开销。
    • 使用智能指针:可以使用智能指针(如std::shared_ptr或std::unique_ptr)来管理指向值类型的指针。智能指针可以自动处理内存管理,确保在不再需要指针时释放内存。
    • 返回静态变量或全局变量:如果返回的指针指向静态变量或全局变量,那么在函数结束后,该指针仍然是有效的。但是,这种方法可能会导致全局状态的问题,因此需要谨慎使用。
  • 应用场景:返回指向值类型的指针可能在某些情况下是有用的,例如:
    • 当值类型对象很大,返回副本会带来性能开销时,可以返回指针来避免复制对象。
    • 当需要在函数之外修改对象的状态时,可以返回指向对象的指针。
  • 腾讯云相关产品:腾讯云提供了各种云计算相关的产品和服务,例如云服务器、云数据库、云存储等。这些产品可以帮助开发者在云环境中进行应用开发、部署和管理。具体的产品介绍和链接地址可以在腾讯云官方网站上找到。

总结:在C++中返回指向值类型的指针并不一定是一种坏做法,但需要注意潜在的问题,并根据具体情况选择合适的解决方案。腾讯云提供了各种云计算相关的产品和服务,可以帮助开发者在云环境中进行应用开发和管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】函数 指针类型参数 与 引用类型参数 对比 ( 修改外部变量需要传入参数要求 | 参数作返回 )

指针与引用类型参数 II . 指针作为参数和返回 III . 引用参数简介 IV . 引用作为参数和返回 I . 博客总结 . 指针与引用类型参数 ---- 1 ....参数使用语言环境 : 引用类型参数只能在 C++ 环境中使用 , 指针类型参数可以用于 C / C++ 两种语言环境 , 因此很多基础库 如 FFMPEG , OpenSL ES 等使用都是指针类型参数...指针作为参数和返回 ---- 指针作为参数和返回 : 如果是指针作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N + 1 维指针 , 传入指向该 N 维指针 指针参数 ( N + 1...C++ 引用参数 : C++ C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数情况 , 使参数具有返回结果能力 ; 3 ....引用作为参数和返回 ---- 引用作为参数和返回 : 如果是引用作为参数 , 修改 N 维指针指向地址 , 那么需要传入 N 维指针引用即可 ,函数修改该引用 , 即可修改外部被引用变量

2.1K20

技术◈C++核心知识总结(I)

也许C语言或Java,确实,变量类型清晰可见,但是C++就不一样了。...,并可以返回不同类型结果,实现代码复用。...类型地址,这里只需要保证指针指向不变即可,至于ptr(地址)是可以改变,也就是说这里const限定了指针指向内存存,即上面pi不可改变。...既然叫常量指针,const限定指针本身,这就意味着指针不可改变,举个例子: double pi = 3.14; double * const ptr = π ptr在其生命周期中永远指向...但是,标准C++不建议使用NILL,因为NULL是整数0宏定义。我们经常使用空指针来初始化一个指针变量,试想一下如果用一个整数作为指针变量,总是有些不妥,尽管编译器不会报错。

74530

C++面向对象程序设计_Part1

模板可以只写一份模板代码,需要生成不同类型class,编译器会自动生成,具体做法类定义最上方加入template ,然后讲所有的double都换成T即可,初始化时候,后面使用尖括号,尖括号中放入你想要生成类型即可...是一种空间换取时间做法,当函数行数只有几行时候,应该将函数设置为内联,提高程序整体运行效率。更加详细说明可以参考这篇文章....传会分配局部变量,然后将传入拷贝到变量,这既要花费时间又要花费内存,传引用就是传指针,4个字节,要快好多,如果担心传入被改变,引用前加const,如果函数试图改变,就会报错。...,所以+=操作符作用在c2上,所以this指向是c2这个对象,然后__doapl函数修改this指向c2。...可以到使用new命令动态分配内存,主要有以下三步,首先分配要构建对象内存,返回是一个空指针,然后对空指针进行转型,转成要生成对象类型初始化给指针,然后指针调用构造函数初始化对象。 ? ?

92620

CString 和 char* 类型转化

1、CString 转化成 char*(1) —— 强制类型转换为 LPCTSTR   这是一种略微硬性转换,我们首先要了解 CString 是一种很特殊 C++ 对象,它里面包含了三个:一个指向某个数据缓冲区指针...LPCTSTR 操作符(或者更明确地说就是 TCHAR * 操作符) CString 类中被重载了,该操作符定义是返回缓冲区地址,因此,如果你需要一个指向 CString 字符串指针的话,可以这样做...I love %s", graycat);   注意由于可变参数列表函数说明是以“...”表示)并没有隐含一个强制类型转换操作符。你会得到什么结果呢?   ...因为 MFC 设计者们设计 CString 数据类型时非常小心, CString 类型表达式求值后指向了字符串,所以这里看不到任何象 Format 或 sprintf 强制类型转换,你仍然可以得到正确行为...所以 GetBuffer 本来返回指向这个临时对象字符串地址指针,但是当这个临时对象被析构后,这块内存就被释放了。

5.9K20

C++】基础知识讲解(引用、内联、auto,基于范围for循环)

C++引用,对指针使用比较复杂场景进行一些替换,让代码更简单易懂,但不能完全替代指针。因为引用定义后,不能改变指向。...作返回 上图中,func返回a,但是函数调用结束时,栈帧就销毁了,这时a返回就是随机。但是VS,它会先把a拷贝给一个临时变量,然后再把返回。...传、传引用效率比较 以作为参数或者返回类型传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量一份临时拷贝,因此用作为参数或者返回类型,效 率是非常低下...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何 一个同类型实体 没有NULL引用,但有NULL指针 sizeof含义不同:引用结果为引用类型大小...结果是不是呢? 结果不是。其实NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)常量 。 为了解决这一问题,C++11引入一个新关键词nullptr。

9910

C语言指针详解

引申:C语言中,定义变量时,定义最前面写上typedef ,那么这个变量名就成了一种类型,即这个类型同义词。    ...指针之间赋值是一种浅拷贝,是多个编程单元之间共享内存数据高效方法。  ...空指针  指向空,或者说不指向任何东西。C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) ,  C++,NULL实质是0。  ...void*类型指针   由于void是空类型,因此void*类型指针只保存了指针,而丢失了类型信息,我们不知道他指向数据是什么类型,只指定这个数据在内存起始地址,如果想要完整提取指向数据...,简单情况下是可以,但是如果返回有其它用途(例如返回函数执行状态量),或者要回传数据不止一个,返回就解决不了了。

2.1K20

JNI开发,你需要知道一些建议

它们本质上都是指向函数表指针指针C++版本,它们被定义为类,该类包含一个指向函数表指针,以及一系列可以通过这个函数表间接地访问对应JNI函数成员函数)。...JNIEnv和JavaVMC声明是不同于C++声明。头文件“jni.h”根据它是以C还是以C++模式包含来提供不同类型定义(typedefs,取别名)。...这些字符串函数返回jchar或者jbyte,都是指向基本数据类型C格式指针而不是局部引用。它们Release调用之前都保证有效,这意味着当Native方法返回时它们并不主动释放。...类型安全:从你Native代码返回了一个不兼容类型(比如说,从一个声明返回String方法却返回了StringBuilder)。...某些实现,GetByteArrayElements和GetPrimitiveArrayCritical将会返回指向维护堆原始数据真实指针,但是另外一些实现中将在Native堆空间分配一块缓冲区然后拷贝数据过去

1.3K30

c++类型转换与RTTI运行阶段类型识别

我们都知道C++完全兼容C语言,C语言转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象指针转换成非const对象指针,可能将基类对象指针转成了派生类对象指针...所以代码两个if判断,只有一个生效。看这种调用方式,是不是和kotlin is 很相象呢。...3、const_castconst_cast运算符,只用于执行一种用途类型转换,即改变为const或volatile。它一般用于去const运算符。但去运算符之后效果却是难以预料。...多态,比如上面代码中有基类Test和TestDerived,现在有一个Test指针,但不知道这个指针究竟指向是基类还是派生类,怎么知道指针指向哪种对象呢?...目前c++中有3个支持RTTI元素:dynamic_cast,将一个指向基类指针来生成一个指向派生类指针,否则,该运算符将返回指针typeid,返回一个指针对象类型type_info,结构存储了有关特定类型信息

15200

CC++常见面试知识点总结附面试真题—-20220326更新

c,int fun() 会解读为返回为int(即使前面没有int,也是如此,但是c++如果没有返回类型将报错),输入类型和个数没有限制, 而int fun(void)则限制输入类型为一个void...,由于c++const常量在编译期就已经决定,下面的做法是OK,但是c是编译通不过。...转换目标类型必须是指针或者引用 拓展 C++,普通类型可以通过类型转换构造函数转换为类类型,那么类可以转换为普通类型吗?答案是肯定。...三目运算符 C中三目运算符(? :)结果仅仅可以作为右,比如如下做法C编译器下是会报错,但是C++却是可以是通过。...A f(); // 这个是不是可以看做声明了一个返回为A函数,函数名为 f,参数无 A g(A()); // 这个是不是可以看做声明了一个返回为A函数,函数名为 g, 参数类型为函数指针,这个函数指针返回类型

1.4K10

对 C 语言指针最详尽讲解

引申:C语言中,定义变量时,定义最前面写上 typedef ,那么这个变量名就成了一种类型,即这个类型同义词。...指针之间赋值是一种浅拷贝,是多个编程单元之间共享内存数据高效方法。...空指针 指向空,或者说不指向任何东西。 C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void*)0) , C++,NULL实质是0。...指针变量是NULL,或者未知地址,或者是当前应用程序不可访问地址,这样指针就是指针。...void*类型指针 由于void是空类型,因此void*类型指针只保存了指针,而丢失了类型信息,我们不知道他指向数据是什么类型,只指定这个数据在内存起始地址。

84640

开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

隐式类型转换,截断,强制类型转换 C++ ,隐式类型转换、截断和强制类型转换都可能导致临时变量创建,并且这些临时变量通常具有常量性质,那就需要用常引用 加了const就好了 ...{ int temp = b; b = a; a = temp; } 1.4.2做返回 C++ ,函数可以返回引用,以避免返回函数结果时产生拷贝。...然而,使用引用作为返回需要小心,确保引用所指向变量函数返回后仍然有效 使用引用作为返回语法是函数声明或定义中将函数返回类型声明为引用类型。...<< "Add(1, 2) is :" << ret << endl; return 0; } 在这里返回是不是随机,取决于是否清理栈帧!!!...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 sizeof含义不同:引用结果为引用类型大小

16310

一文掌握C++基本语法

5.1 函数重载概念 函数重载:是函数一种特殊情况,C++允许同一作用域中声明几个功能类似的同名函数,这些同名函数形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同问题...因此只有第一次调用函数后ret是1,调用一次函数(函数重载<<)后n空间被制成随机数,因此剩下两次都是随机数,因此我们用引用作返回时候返回应该是出了函数定义域还存在变量引用,否则就应该按返回...另外引用作返回也会提高效率 6.5 传、传引用效率比较 以作为参数或者返回类型传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量一份临时拷贝,因此用作为参数或者返回类型...sizeof含义不同:引用结果为引用类型大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节) 5. 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型大小 6....指针nullptr(C++11) 10.1 C++98指针 传统头文件中有如上定义,我们发现在C++Null被宏替换为0,而如果我们要对一个指针赋空,仍采用NULL的话有些不妥,因为

65710

C++】异常+智能指针+特殊类和类型转换

sp2内部成员变量,这样sp1就会变成管理sp2指向资源智能指针了。...,如果以这样方式来实现,那么我们必须提供一个静态成员方法用于返回开辟栈上对象,此时就不能禁用拷贝构造函数了,因为静态方法StackOnly返回必须是拷贝,同时就会带来一个问题,main里面实际可以利用拷贝构造来定义出静态区对象...另一种实现懒汉方式就是直接返回静态对象,而不是以返回指针方式来实现,当然这样方式也是可以实现延迟加载,因为只有函数GetInstance被调用时候,才会开辟好这个静态对象,这样方式开辟出来对象就是存在数据段上面的...例如下面代码,可以将基类类型ptr转为派生类类型dptr,如果ptr指向是父类则会存在越界访问风险,如果ptr指向是子类则没什么问题,只不过把指针访问范围挪动几个字节即可。...当dynamic_cast转换类型失败时候,会返回一个空指针,如果转换成功,则返回指向派生类对象有效指针

30340

一个 Java 程序员眼中 Go 语言

局部变量 Java 语言中,局部变量(新版本,有时候对象也是)被保存在栈。C、C++等等其他类似实现调用栈语言也是如此。Go 语言也差不多,除了… … 除了函数可以返回局部变量指针。...当 Go 编译器发现被创建“对象”(晚点晚再解释用引号原因)将会脱离函数作用域,它会妥善处理这种情况,保证该对象函数返回后继续存活,其指针不会指向废弃内存地址,获得不确定数据。...如此,将错误信息编码为无意义负值这种传统(比如 C 标准库做法,通常返回 -1 作为错误码,非负值则表示有意义返回),转换为一种更加可读方式。 多赋值不只用在函数上。...后一种情况下,方法可以操作结构体(此时,结构就不能被认为是一种类型,因为类型应当是不可变)。上述方法都可以完整实现接口。...如果变量类型是接口,那么它就成为指针,与此同时引用该真正类型。 如果变量即不是接口也不是结构体指针,你无法完成同样功能:只会得到一个运行时错误。

76930

C++程序员经常问11个问题

因为这些实质上不同,你不能在一个程序混淆使用这两个库。做为一种习惯,代码中一般使用,但如果你处理是过去编写代码,为了继承可以用继续用旧保持代码一致性。  ...在运行时,C++创建一个为2int类型临时变量,并传递它引用给f().这个临时变量和它引用从f()被 调用开始被创建并存在直到函数返回返回时,就被马上删除。...C++会计算每个表达式,但完整“逗号分离”表达式结果是最右边表达式。因此,仅当cin.good()返回true时,if条件才是true。...要点5:避免使用复杂构造指向函数指针   指向函数指针C++可读性最差语法之一。你能告诉我下面语句意思吗?...>*pmi=5;   指向函数成员指针   它由函数成员所返回数据类型构成,类名后跟上::符号、指针名和函数参数列表。

84320

C++变量声明与定义规则

static 当我们C/C++用static修饰变量或函数时,主要有三种用途: 局部静态变量 外部静态变量/函数 类内静态数据成员/成员函数 其中第三种只有C++中有,我们后续面向对象程序设计再探讨...这种文件中进行静态声明做法是从C语言继承而来C语言中声明为static全局变量在其所在文件外不可见。这种做法已经被C++标准取消了,现在替代做法是使用匿名命名空间。...顶层const与底层const 指针本身是一个对象,因此指针本身是不是常量与指针所指对象是不是常量是两个独立问题,前者被称为顶层const,后者被称为底层const。...Tips:尽管指针和引用都能被定义成constexpr,但它们初始却受到严格限制。一个constexpr指针初始必须是nullptr、0或者是存储于某个固定地址对象。...// 底层const: pi1是指向整型常量普通指针 constexpr int *pi2 = nullptr; // 顶层const: pi2是指向整型常量指针 我们也可以让constexpr指针指向常量

2.3K10

《C++Primer》第十二章 动态内存

动态内存和智能指针 c++,动态内存管理是通过一对运算符来完成: new:动态内存为对象分配空间并返回一个指向该对象指针 delete:接收一个动态对象指针,销毁该对象并释放与之关联内存空间...有一种可以避免空悬指针做法指针即将离开其作用域之前释放掉它所关联内存,这样指针关联内存被释放掉之后,就没有任何机会继续使用指针了。...另一种做法delete之后将指针赋值为nullptr,这样可以清楚地指出指针指向任何对象。...// 这段代码抛出来一个异常,且f未被捕获 } // 函数结束时shared_ptr自动释放内存 2.5 智能指针和哑类 包括所有标准库在内很多C++类都定义了析构函数负责清理对象使用资源...T构造函数,用来p指向内存构造一个函数 a.destory(p):p为类型T*指针,此算法对p指向对象执行析构函数 为了使用allocate返回内存,我们必须用construct构造对象

1.3K10

【专业技术】你必须注意11个C++要点

在运行时,C++创建一个为2int类型临时变量,并传递它引用给f().这个临时变量和它引用从f()被调用开始被创建并存在直到函数返回返回时,就被马上删除。...C++会计算每个表达式,但完整“逗号分离”表达式结果是最右边表达式。因此,仅当cin.good()返回true时,if条件才是true。...要点5:避免使用复杂构造指向函数指针 指向函数指针C++可读性最差语法之一。你能告诉我下面语句意思吗?...void (*p[10]) (void (*)()); P是一个“由10个指针构成指向一个返回void类型指向另一个无返回和无运算函数数组”。这个麻烦语法真是让人难以辨认,不是吗?...5; 指向函数成员指针 它由函数成员所返回数据类型构成,类名后跟上::符号、指针名和函数参数列表。

97050

Unity3d底层数据传递分析

二 封送 C#string,通过内部调用传给C++时,会使用MonoString* ,它是指向托管堆对象字符串类型指针,这个转换就是封送(Marshalling)。...因为不能确定托管堆内存会何时失效,非托管代码,我们不应该缓存任何托管代码传进来数据。 另一种情况是返回,类非托管代码,不可以作为返回,只可以返回指针。...因为堆内容无法互通,当返回到托管代码时,会经历以下步骤: 1. 托管代码调用非托管代码,返回指向非托管内存结构体指针。 2....内部调用 内部调用是C++中注册调用,并直接访问托管对象,控制Marshall。例如,我们要返回字符串,就先要在C++显示注册接口。 ? 然后C#声明下面的函数: ?...结构体非托管代码,可以作为返回,但不可以返回ref或out。所以要想返回指向结构指针,就必须使用IntPtr,或在外部定义unsafe。

1.3K20

Effective C++条款13 C++基本功之智能指针

旧式C++程序开发过程,我们会比较习惯用传统指针来管理资源,通过成对使用new和delete来保证内存安全,这种做法不会造成太大问题,只是某些情况下会出现内存难于管理局面。...std::make_shared 能够用来消除显式使用 new, 并返回这个对象类型std::shared_ptr指针。...线程安全智能指针 智能指针线程安全需要考虑2个问题,一个是多线程状态下智能指针内部引用计数是否是线程安全,另外一个问题是多线程智能指针指向读写是否是线程安全。...一般而言,如果一个智能指针初次赋值后,后续不需要写入操作,那么所有的读取操作都是线程安全。而如果后续需要改变这个指针指向,那么就需要加锁。...总结 智能指针这种技术并不新奇,很多语言中都是一种常见技术,现代 C++ 将这项技术引进,在一定程度上消除了 new/delete 滥用,是一种更加成熟编程范式。

76441
领券