C ++中的指针和向量

时间:2012-02-09 18:30:24

标签: c++ pointers vector

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

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

vector<MyClass>* myMethod()

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

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

MyClass* object;
myVector.push_back(*object);

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:7)

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

  1. 它必须是指向矢量的指针吗?不能只是vector<MyClass>
  2. 此方法是否也应为此向量分配内存?
  3. 此方法的调用方delete / free是否应该记忆?
  4. 对于你的第二个问题:只有在真正需要的时候,我才能制作指向MyClassvector<MyClass*>)对象的指针。它会给你带来一些内存管理方面的麻烦,所以让我们选择一种更简单的方法。

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

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

    来电者应该清理一下:

        vector<MyClass>* v = myMethod();
        // do some stuff
        delete v; // clean up
    

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

    vector<MyClass> _x; // caller can not access _x but myMethod can
    
    vector<MyClass>* myMethod()
    {
        return &_x;
    }
    
    在这种情况下,

    调用者不应删除此向量:

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:1)

是的,您可以返回指向矢量的指针,这意味着您希望能够修改此矢量。请记住,您不能返回指向局部变量的指针。

至于在向量中推送指针 - 它取决于你想做什么,但你没有必要推动poiners。