2012-02-09 86 views
4

我开始用C++,我有一个疑惑:指针和载体在C++

我正在将返回一类MyClass的对象的矢量的函数。

vector<MyClass>* myMethod() 

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

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

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

'我做这将返回一个类的对象的载体的功能MyClass'不,你不是。你正在返回一个指针。 – 2012-02-09 19:33:00

+0

'返回指针是正确的吗?'这取决于很多很多事情。 – 2012-02-09 19:33:34

+0

你的代码示例(a)使用了一个无效指针和无效的对所述无效指针的解引用; (b)没有意义,因为你根本没有在指针中插入指针 – 2012-02-09 19:33:56

回答

6

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

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

和你的第二个问题:我会作出的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 
+0

问题2:如果我返回指向矢量的指针,该方法是否会自动为我分配内存?如果我不会返回一个指针,当矢量将从内存中删除?谢谢! – Maverik 2012-02-09 19:13:51

+1

@lucaghera:我编辑了我的答案。 – LihO 2012-02-09 19:28:34

+0

最后一个问题;)如果我还没有返回一个指针,如果我分配内存? ('vector * v = new vector ') – Maverik 2012-02-09 19:33:26

5

在C++ 11中,您可以简单地返回std::vector<T>,它会很快。由于std::vector支持移动语义,所以临时分配的资源将被移动语义函数窃取,所以没有临时变得无用。

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

+3

即使没有C++ 11返回'std :: vector '也经常没问题。 RVO早在2011年之前就已存在。 – kennytm 2012-02-09 18:35:08

+0

@KennyTM:在任何情况下都不保证RVO。 – Nawaz 2012-02-09 18:35:49

+3

@Nawaz:如果首先满足复制elision的条件,则仅从局部变量自动移动。 – 2012-02-09 18:36:36

8

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

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

+0

谢谢,我的问题是:当你建议我使用指向矢量的指针? – Maverik 2012-02-09 19:15:54

+1

+1不要强调“不要使用裸指针”。 – 2012-02-09 19:16:13

1

是的,你可能会返回一个指向矢量的指针,并且这意味着你想修改这个矢量。请记住,您不得返回指向局部变量的指针。

至于推向量中的指针 - 这取决于你想做什么,但你不必推动poiners。