在我的C代码中,我有一个类Object,它配有int类型的id字段.现在我想创建一个Object *类型的指针向量.首先我试过了
vector<Object*> v; for(int id=0; id<n; id++) { Object ob = Object(id); v.push_back(&ob); }
但这失败了,因为这里同一个地址只重复了n次.如果我使用new运算符,我会得到我想要的但我想避免动态内存分配.然后我认为我需要的是以某种方式在for循环之前声明n个不同的指针.直截了当的方式是声明一个数组,所以我这样做:
vector<Object*> v; Object ar[n]; for(int i=0; i<n; i++) { ar[i] = Object(i); } for(int i=0; i<n; i++) { v.push_back(ar+i); }
如果我这样做,是否还有可能导致内存泄漏?在我看来,通过数组声明也有点笨拙.有没有其他方法来创建指针向量但避免手动内存管理?
编辑:为什么我想要指针而不仅仅是普通对象?
好吧,我稍微修改了原来的实际情况,因为我以这种方式思考,我可以用最简单的形式表示问题.无论如何,我仍然认为这个问题可以在不知道为什么我需要一个指针向量的情况下得到解答.
其实我有
Class A { protected: vector<Superobject*> vec; ... }; Class B: public A {...}; Class Superobject { protected: int id; ... } Class Object: public Superobject {...}
在派生类B中,我想用Object类型的对象填充成员字段vec.如果超类没有使用指针,我会遇到对象切片问题.所以在B类构造函数中,我想将vec初始化为Object *类型的指针向量.
EDIT2
是的,在我看来,动态分配是合理的选择,使用数组的想法是个坏主意.当数组超出范围时,事情就会出错,因为向量中的指针指向不一定包含对象的内存位置.
在B类的构造函数中我有
B(int n) { vector<Object*> vec; Object ar[n]; for(int id=0; id<n; id++) { ar[id] = Object(id); } for(int id=0; id<n; id++) { v.push_back(ar+id); } }
这在B类对象中引起了非常奇怪的行为.
解决方法
在这个循环中:
for(int id=0; id<n; id++) { Object ob = Object(id); v.push_back(&ob); }
您正在堆栈上创建n次Object实例.在每次迭代时都会创建并删除元素.你可以使用它来避免这种情况:
for(int id=0; id<n; id++) { Object* ob = new Object(id); v.push_back(ob); }
感谢每个新元素都存在于堆上而不是堆栈上.尝试在类构造函数中添加类似的东西:
std::cout<<"Object ctor()\n";
和析构函数中的相同:
std::cout<<"Object dtor()\n";
如果您不想使用@woolstar编写的“新”尝试原因创建这些对象