C++中的指针和向量
Posted
技术标签:
【中文标题】C++中的指针和向量【英文标题】:Pointer and vectors in C++ 【发布时间】:2012-02-09 18:30:24 【问题描述】:我从 C++ 开始,我有一个疑问:
我正在创建一个函数,它将返回类 MyClass
的对象向量。
vector<MyClass>* myMethod()
第一个问题,返回指针对吗?
第二个问题是:如果我要返回一个指针,我是否也应该将 MyClass 对象的指针插入到向量中?
MyClass* object;
myVector.push_back(*object);
【问题讨论】:
I'm making a function which will return a vector of objects of a class MyClass
不,你不是。你正在返回一个指针。
it's correct to return a pointer?
这取决于很多很多事情。
您的代码示例 (a) 使用了无效指针和无效指针的无效解引用; (b) 没有意义,因为您根本没有将指针插入向量中
【参考方案1】:
向量可以是对象向量或指针向量。这与您是否拥有向量或指向该向量的指针完全无关。
如果您刚开始使用 C++,请尽量避免使用指针。只需返回一个对象向量。请记住,向量包含它的内容。当您将对象放入向量中时,它将被复制。
【讨论】:
谢谢,我的问题是:你什么时候建议我使用指向向量的指针?【参考方案2】:像这样返回指向向量的指针的方法没有错:vector<MyClass>* myMethod()
。但是你应该问自己一些问题,比如:
-
它必须是指向向量的指针吗?不能只是
vector<MyClass>
吗?
此方法是否也应为此向量分配内存?
这个方法的调用者应该delete
/free
这个内存吗?
关于你的第二个问题:只有在确实有必要时,我才会制作指向 MyClass
(vector<MyClass*>
) 对象的指针向量。它会给你的内存管理带来一些麻烦,所以让我们选择一种更简单的方法。
好的,我们来说说这个问题:这个方法是不是也应该给这个vector分配内存? 如果这个方法的目的是创建一个向量,那么是的,这个方法也应该为它分配内存:
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:如果我返回一个指向向量的指针,该方法会自动为我分配内存吗?如果从内存中删除向量时我不返回指针?谢谢! 最后一个问题 ;) 如果我分配内存也不返回指针? (vector<MyClass>* v = new vector<MyClass>
)
如果您返回向量 (vector<int> myMethod()
) 并且调用者调用了vector<int> v; v = myMethod();
,则从您的方法返回的向量副本被创建并存储到v
。【参考方案3】:
在 C++11 中,你可以简单地返回std::vector<T>
,它会很快。因为std::vector
支持move-semantic,所以没有一个temporary是无用的,这意味着分配给temporary的资源将被move-semantic函数窃取。
如果您的类型 T
管理资源,那么您也应该实现移动语义以及通常的复制语义。
【讨论】:
即使没有 C++11 返回std::vector<T>
通常也可以。 RVO 早在 2011 年之前就已经存在。
@KennyTM:并非在所有情况下都保证 RVO。
@Nawaz:仅当首先满足复制省略的条件时,才会从局部变量自动移动。
@R.MartinhoFernandes:我不明白你的评论以及你为什么要这样说?
@Nawaz:因为如果复制省略不会发生,那么自动移动也不会发生。【参考方案4】:
是的,你可以返回一个指向向量的指针,这意味着你希望能够修改这个向量。请记住,您不能返回指向局部变量的指针。
至于在向量中推指针 - 这取决于你想做什么,但你不必推指针。
【讨论】:
以上是关于C++中的指针和向量的主要内容,如果未能解决你的问题,请参考以下文章