gpt4 book ai didi

c++ - 创建指针的c++ vector

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:07:17 25 4
gpt4 key购买 nike

在我的 C++ 代码中,我有一个 Object 类,它配备了一个 int 类型的 id 字段。现在我想创建一个 Object* 类型的指针 vector 。首先我尝试了

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);
}

如果我这样做,是否仍有可能发生内存泄漏?在我看来,通过数组声明也有点笨拙。有没有其他方法可以创建指针 vector 但避免手动内存管理?

编辑:为什么我需要指针而不只是普通对象?

那么我对原来的实际情况做了一点修改,因为我认为这样我可以用最简单的形式来表达问题。不管怎样,我仍然认为这个问题可以在不知道为什么我想要一个指针 vector 的情况下得到回答。

其实我有

Class A {
protected:
vector<Superobject*> vec;
...
};

Class B: public A {...};

Class Superobject {
protected:
int id;
...
}

Class Object: public Superobject {...}

在派生类 B 中,我想用 Object 类型的对象填充成员字段 vec。如果父类(super class)不使用指针,我将在对象切片方面遇到问题。所以在 B 类构造函数中,我想将 vec 初始化为 Object* 类型的指针 vector 。

编辑2

是的,在我看来动态分配是合理的选择,而使用数组的想法是个坏主意。当数组超出范围时,事情就会出错,因为 vector 中的指针指向不再一定包含对象的内存位置。

在 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);
}

感谢每个新元素都存在于堆上而不是堆栈上。尝试在类 Object 构造函数中添加类似这样的内容:

std::cout<<"Object ctor()\n";

在析构函数中也是如此:

std::cout<<"Object dtor()\n";

如果您不想用@woolstar 编写的"new"尝试原因创建这些对象

关于c++ - 创建指针的c++ vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20158793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com