gpt4 book ai didi

c++ - 指向父的指针无故更改

转载 作者:太空宇宙 更新时间:2023-11-04 15:38:19 26 4
gpt4 key购买 nike

我有两个类这样说 A 和 B:

// A.h
#include <iostream>
#include <vector>
using namespace std;

#ifndef A_H_
#define A_H_

#include "B.h"

class A {
public:
std::vector<B> bVec;
A();
void foo();
virtual ~A();
};
#endif /* A_H_ */

//--------------------
// A.cpp
#include "A.h"

A::A() {
B b(this);
bVec.push_back(b);
}

void A::foo() {
for(int i=0; i<bVec.size(); i++)
bVec[i].addNewB();
}

A::~A() {
}


//--------------------
// B.h

#include <iostream>
#include <vector>
using namespace std;

#ifndef B_H_
#define B_H_

class A;

class B {
public:

A* parent;
double data[15];

B(A* p);
void addNewB();
virtual ~B();
};

#endif /* B_H_ */

//--------------------
// B.cpp

#include "B.h"
#include "A.h"

B::B(A* p) {
parent = p;
}

void B::addNewB() {
A* tmpA = parent;
if(parent->bVec.size() < 3)
{
std::cout<< "Before: " << parent->bVec.size() << '\n';
parent->bVec.push_back(B(parent));
std::cout<< "After: " << parent->bVec.size() << '\n';
}
if(tmpA == parent)
cout<< "parent the same\n";
else
cout<< "parent changed\n";
}

B::~B() {
}

//--------------------
// main.cpp

#include <stdio.h>
#include "A.h"

int main()
{
A a;
a.foo();
std::cout<< "finish\n";
return 0;
}

当我运行这段代码时,我得到了这些结果:

Before: 1

After: 16276538888567495168

parent changed

Before: 2

After: 3

parent the same

parent the same

finish

如您所见,问题是有时在 push_back 之后父指针会发生变化。我尝试在 push_back 之前和之后调试代码,我检查了父指针。在此之前它是一些地址,但在那之后它是其他东西加上这个文本:它似乎有段错误。

这里问题的关键似乎是 B 的每个实例的大小。如果我将“数据”的大小更改为任何低于 14 的值,程序运行正常,但对于 14 或更高的值,就会发生这种情况。

这看起来很奇怪,我花了好几天时间来解决这个问题。你能告诉我为什么会这样吗?

最佳答案

void B::addNewB() {
A* tmpA = parent;
if(parent->bVec.size() < 3)
{
std::cout<< "Before: " << parent->bVec.size() << '\n';
parent->bVec.push_back(B(parent));
std::cout<< "After: " << parent->bVec.size() << '\n';
}
if(tmpA == parent)
cout<< "parent the same\n";
else
cout<< "parent changed\n";
}

bVec 在这里发生了变化,它包含正在运行代码的特定 B 对象的 this

void A::foo() {
for(int i=0; i<bVec.size(); i++)
bVec[i].addNewB();
}

bVec 在此调用中发生更改。在超过预分配堆空间的 push_back() 调用中(可能像这个),vector 需要重新分配堆内存并将所有内容移动过来。在移动过程中,vector 破坏了运行该代码的 B 对象。控制权已恢复到具有过时的 thisB 代码,因此 this->parent 现在包含垃圾。

回溯可能是这样的:

A::foo()
B::addNewB()
vector<B>::reallocate() //destroys previous frame's B

关于c++ - 指向父的指针无故更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124050/

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