gpt4 book ai didi

c++ - 给定一个类的对象数组,类成员 vector 的内存分配有问题吗?

转载 作者:行者123 更新时间:2023-11-30 01:30:01 26 4
gpt4 key购买 nike

我的基本程序结构是这样的:

class B1 
{
vector <someStruct> aStruct; //some struct contains a vector of 'someotherStruct's, etc
B1() { cout << &aStruct << " ";};
};


class B2 {B1* pB1;};

class A
{
B1 object_B1;
B2 object_B2;

A() { objectB2.pB1 = &object_B1;};
};

int main()
{
vector <A> someA;
for(int q=0; q < N; q++)
someA.push_back(A());

cout << endl;

for (int q=0; q < N; q++)
cout << someA[q].B2.pB1 << " ";
}

所以如果 N 是 5,输出将是:0xbffff828 0xbffff828 0xbffff828 0xbffff828 0xbffff828\n
0xbffff828 0xbffff828 0xbffff828 0xbffff828 0xbffff828

换句话说,每个对象的 vector 在内存中占据相同的空间。程序输出也证实了这一点,因为通过不同的对象访问 vector 中的数据会给出相同的值,即使它们应该不同。当然,另一件奇怪的事情是它为 vector 提供了与对象相同的地址。

最佳答案

忽略程序中的大量错误...

A.push_back(A());

这将创建一个 A 类型的临时对象。 object_B2.pB1成员变量被初始化为指向这个临时对象的object_B1成员变量。

这个临时的 A 对象随后被复制someA 容器中。此拷贝的 object_B1 成员变量的地址不同,但您没有更新 object_B2.pB1 成员变量以指向新实例。为此,您需要实现一个复制构造函数(并且,为了正确起见,您还需要实现一个复制赋值运算符)。

所有指针最终都相同的原因是临时对象都在内存中的相同位置创建,这使得,因为你可能在循环中调用 push_back , 因此可以在循环的每次迭代中在堆栈中的相同位置创建临时对象。

关于c++ - 给定一个类的对象数组,类成员 vector 的内存分配有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055334/

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