如何在C ++中使函数返回指向数组或对象的指针?

时间:2017-11-21 22:54:23

标签: c++ c++11 arduino

我对很多答案感到困惑,这些答案是关于其他语言的简单事情。我想获得对类或结构中包含的对象的引用。我已经开始使用两种不同的函数之一(这里是 getData ())。

问题:

所以,我不确定使用哪一个,他们似乎做同样的事情。其他的,有什么理由我应该关心,因为它是一个联盟?这里最重要的问题是 - 我不确定 删除 我在一些答案中找到的部分,这让我感到害怕,我所展示的这个代码示例并不完整并且会在某些时候导致一些内存泄漏。

#include <iostream>
#include <stdint.h>

using namespace std;

class settings_t {
  private:
  static const  long b1 =0;
    uint8_t setmap;
  public:
    uint8_t myBaseID; 
    uint8_t reserved1;
    uint8_t reserved2;
};  

class test1 {
  public: //actually, I want this to be private
    long v1;
    settings_t st;
    union {
      uint8_t data[4];
      uint32_t m1;
      settings_t st1;
    };
  public:
    uint8_t * getData() {
      return data;
    }
    uint8_t (&getData2())[4] {
      return data;
    }
};

int main() {
  test1 t1;
  t1.data[2]=65;
  uint8_t *d1 = t1.getData();
  cout<<" => " << d1[2];
  d1[2]=66;
  uint8_t *d2 = t1.getData2();
  cout<<" => " << d2[2];
}

1 个答案:

答案 0 :(得分:1)

c ++与c#或java等语言的主要区别在于它不提供内置内存管理(不是托管语言)。因此,如果程序在c ++中分配内存,则程序有责任在不需要时释放内存。所以,你答案中的delete是基于这个要求的。

但是在您的情况下,getData()函数返回指向数据的指针,该数据是类test1的一部分。这是一个数组,只要该类的对象存在,该数组就会存在。两个版本的getData都可以使用。

您没有使用任何动态数据分配,类型t1的对象test1已在主函数的堆栈上分配,并且将存在直到您的程序退出。你不应该担心'删除'。

您使用的两种方法之间的区别在于第一种方法不关心它返回的数组大小,而另一种方法是否。因此,第二种方法的实际应用非常有限,但提供了更好的语法检查。