当前位置: 首页 > 知识库问答 >
问题:

c++ - 返回类型用指针还是引用?

谭翔
2024-01-02

大佬们,这样写在c++中会产生什么问题啊?

OpenGL::VertexStruct& OpenGL::CreateTorus(int prec, float inner, float outer) {    VertexStruct* v = new VertexStruct;    return (*v);}
OpenGL::VertexStruct&torus = OpenGL::CreateTorus();delete (&torus);

共有2个答案

司空瑾瑜
2024-01-02

只有这几行好像也没有什么问题。

但是最后不要这样,可读性太差了。

new 出来的东西还是用指针吧。至少需要 delete 它的地方通常是持有一个指针的。

用引用的话,通常意味着它永远不会“空”,并且也不需要 delete 。

高德水
2024-01-02

这段代码中存在几个问题。

首先,OpenGL::CreateTorus 函数试图返回一个局部变量的引用。这是一个常见的错误,因为当函数执行完毕时,局部变量会被销毁,留下的引用就会悬空。这会导致未定义的行为。

其次,函数中的 new 运算符动态地创建了一个 VertexStruct 对象,但并没有对应的 delete 操作来释放内存。这会导致内存泄漏。

对于应该使用指针还是引用,这取决于具体情况。在 C++ 中,引用通常用于提供对象的别名,而不是用于处理动态分配的内存。指针更常用于动态内存管理。

修正后的代码可以这样写:

OpenGL::VertexStruct* OpenGL::CreateTorus(int prec, float inner, float outer) {    VertexStruct* v = new VertexStruct;    return v;}// 使用时需要手动删除指针以避免内存泄漏OpenGL::VertexStruct* torus = OpenGL::CreateTorus();delete torus;

请注意,在使用指针时,一定要记住在不再需要时删除它们,以避免内存泄漏。

 类似资料:
  • C++ 指针 在上一章中,我们已经了解了 C++ 中如何从函数返回数组,类似地,C++ 允许您从函数返回指针。为了做到这点,您必须声明一个返回指针的函数,如下所示: int * myFunction() { . . . } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第

  • 本文向大家介绍Go语言的方法接受者类型用值类型还是指针类型?,包括了Go语言的方法接受者类型用值类型还是指针类型?的使用技巧和注意事项,需要的朋友参考一下 概述 很多人(特别是新手)在写 Go 语言代码时经常会问一个问题,那就是一个方法的接受者类型到底应该是值类型还是指针类型呢,Go 的 wiki 上对这点做了很好的解释,我来翻译一下。 何时使用值类型 1.如果接受者是一个 map,func 或者

  • 问题内容: 我有一个HashMap: 然后我这样做: 第一次打印1000,第二次打印1000,该值不变。为什么Java按值而不是按引用返回Integer? 问题答案: 该方法返回对存储整数的引用的 副本 。 给存储该副本的变量分配一个新值,指向该值将 不会 更改映射中的引用。 如果可以的话,它会工作,但是由于是一个不可变的类,因此这不是一个选择。 如果要使更改在地图中生效,则必须将余额包装在(可变

  • 2. 指针类型的参数和返回值 首先看以下程序: 例 23.1. 指针参数和返回值 #include <stdio.h> int *swap(int *px, int *py) { int temp; temp = *px; *px = *py; *py = temp; return px; } int main(void) { int i = 10, j = 20; int *p

  • 问题内容: 这些天来我一直在学习Java,而我读到的才是真正有趣的。现在,我想知道C#中的Properties和Accessor方法是否相同?还是C#已经自动返回克隆的副本? 谢谢。 问题答案: 引用就是……对存储在内存中的某个对象的引用。除非您明确编写代码以创建克隆并返回对该对象 的引用 ,否则您将始终绕过对同一实例的引用。 它试图避免您遇到的情况是将对象引用移交给您所依赖的调用方。您无法控制谁

  • 在 C 中实现回调函数时,我是否仍应使用 C 样式函数指针: 或者我应该使用std::函数: