【发布时间】:2013-11-23 05:07:11
【问题描述】:
在我的 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 类的对象中引起了非常奇怪的行为。
【问题讨论】:
-
如果您不想要动态内存分配,那么为什么要使用指针?您也可以使用 Object 数组。
-
为什么要首先存储指针?
-
第二种方法的问题是它不是合法的 C++。
Object ar[n];是不合法的,除非 n 是一个常数。此外,由于根据您的编辑,您有一个类层次结构,但使用Object ar[n];您只有对象,而不是超对象。顺便说一句,您的第一种方法也是错误的,因为您要存储已被破坏的对象的地址。我只会使用动态内存分配。