C++中的指针和向量

Mav*_*rik 4 c++ pointers vector

我从C++开始,我有一个疑问:

我正在创建一个函数,它将返回一个类对象的向量MyClass.

vector<MyClass>* myMethod()
Run Code Online (Sandbox Code Playgroud)

第一个问题是,返回一个指针是正确的吗?

第二个问题是:如果我要返回一个指针,我还应该将MyClass对象的指针插入向量吗?

MyClass* object;
myVector.push_back(*object);
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 9

矢量可以是对象矢量或指针矢量.这完全独立于是否有向量或指向向量的指针.

如果你开始使用C++,请尽量避免使用指针.只需返回一个对象矢量.请记住,向量包含其内容.将对象放入向量时,它将被复制.


Lih*_*ihO 7

没有什么错方法,返回指针向量是这样的:vector<MyClass>* myMethod().但你应该问自己一些问题,比如:

  1. 它必须是指向矢量的指针吗?难道不是vector<MyClass>吗?
  2. 该方法是否也为此向量分配内存?
  3. 应该调用这个方法delete/ free这个内存吗?

对于你的第二个问题:只有在真的有必要的时候,我才能制作指向MyClass(vector<MyClass*>)对象的指针.它会给你带来一些内存管理方面的麻烦,所以让我们选择一种更简单的方法.

好的,我们来谈谈这个问题:这个方法是否也应该为这个向量分配内存?
如果此方法的目的是创建一个向量,那么是的,该方法还应该为它分配内存:

vector<MyClass>* myMethod()
{
    vector<MyClass>* v = new vector<MyClass>;
    // initialize, fill or do whatever with this vector
    return v;
}
Run Code Online (Sandbox Code Playgroud)

来电者应该清理一下:

    vector<MyClass>* v = myMethod();
    // do some stuff
    delete v; // clean up
Run Code Online (Sandbox Code Playgroud)

如果目的只是检索指向调用者无法获取的某个特定向量的指针,它可能如下所示:

vector<MyClass> _x; // caller can not access _x but myMethod can

vector<MyClass>* myMethod()
{
    return &_x;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,调用者不应删除此向量:

    vector<MyClass>* v = myMethod();
    // do some stuff, don't delete v
Run Code Online (Sandbox Code Playgroud)


Naw*_*waz 5

在C++ 11中,您可以简单地返回std::vector<T>,它会很快.暂时无用,因为std::vector支持移动语义,这意味着为临时分配的资源将被移动语义功能窃取.

如果你的类型T管理资源,那么你应该实现移动语义,以及通常的复制语义.

  • 即使没有C++ 11返回`std :: vector <T>`通常也没问题.RVO早在2011年就已存在. (3认同)
  • @Nawaz:只有在首先满足复制省略的标准时,才会发生局部变量的自动移动. (3认同)