c ++向量容器中指针的用法是什么

时间:2013-12-10 21:48:08

标签: c++ pointers stdvector

我在这里看到了这个:http://pastebin.com/6Q7zS7tC并且想知道为什么这些指针“需要”或者当它们作为指针启动时可以有效地使用? 向量容器中的字符串指针和向量容器内的coord结构指针。

class objloader{
std::vector<std::string*> coord;        //every line of code from the obj file
std::vector<coordinate*> vertex;        //all vertexes
std::vector<face*> faces;                                       //all faces
std::vector<coordinate*> normals;       //all normal vectors
std::vector<GLuint> texture;
std::vector<unsigned int> lists;        //the id for all lists (so we can delete the lists after use it)
std::vector<material*> materials;       //all materials
std::vector<texcoord*> texturecoordinate;       //all texture coorinate (UV coordinate)
bool ismaterial,isnormals,istexture;    //obvious
unsigned int loadTexture(const char* filename); //private load texture function
void clean();   //free all of the used memory
public:
objloader();
~objloader();   //free the textures and lists
int load(const char* filename); //the main model load function
};

class objloader{ std::vector<std::string*> coord; //every line of code from the obj file std::vector<coordinate*> vertex; //all vertexes std::vector<face*> faces; //all faces std::vector<coordinate*> normals; //all normal vectors std::vector<GLuint> texture; std::vector<unsigned int> lists; //the id for all lists (so we can delete the lists after use it) std::vector<material*> materials; //all materials std::vector<texcoord*> texturecoordinate; //all texture coorinate (UV coordinate) bool ismaterial,isnormals,istexture; //obvious unsigned int loadTexture(const char* filename); //private load texture function void clean(); //free all of the used memory public: objloader(); ~objloader(); //free the textures and lists int load(const char* filename); //the main model load function };

3 个答案:

答案 0 :(得分:0)

STL库广泛使用复制来(重新)安排容器内的成员。因此,如果对象复制起来很昂贵,通常会使用指针。一般建议是避免使用指针,因为在STL容器中存储指针很容易产生内存泄漏。为了解决这个问题,你可以编写一个封装类(当然应该很便宜复制)或使用Boost智能指针或新的C ++ 11智能ptrs。

答案 1 :(得分:0)

position只有一个带参数的显式构造函数,因此它需要是一个在容器中使用的指针。但是std::string没有相同的限制。

答案 2 :(得分:0)

无法判断您发布的内容是否“需要”。根据此代码的实现方式,可能需要它们。您需要查看整个程序以了解其整体设计,以确定是否有在这些容器中使用指针的替代方法。

在像这样的容器中保持指针是很常见的。

是的,在容器中保存指针是有效的。

注意:只要有指针容器,就必须确保指向的对象被正确删除。在向量上调用delete不会释放指针指向的对象使用的内存。在容器中存储指针时,确保正确内存管理的三种常用方法是:

  1. 遍历容器并在每个指针上调用delete
  2. 使用智能指针代替常规指针
  3. 使用boost指针容器代替STL容器