编辑:解决方案
这个问题可能涉及一个严重的 UB。我正在寻找一个解释并解决这个问题。
最后我和我的团队遇到了一个奇怪的(但可以解释的)问题,我们在网上找不到任何类似的问题,我们想要一些答案。
我们有一个类 [TesrClass] 和这个类的向量容器。 TestClass 函数之一,导致向量容器重新分配(在推送/放置期间),并在之后继续使用类成员变量/函数 [UB?] 的一些后续步骤。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class TestContainer;
class TestClass {
public:
TestClass(int n, TestContainer *tcontainer) {
num = n;
container = tcontainer;
}
void func();
private:
int num;
TestContainer *container;
void class_member_function();
};
class TestContainer {
public:
vector<TestClass> tc_vec;
};
void TestClass::class_member_function() {
cout << "Class Member Function:" << endl << endl;
cout << "Container Vector Data:" << endl;
for (auto& elem : container->tc_vec) {
cout << "Object Address: " << &elem << " | Number: " << elem.num << endl;
}
cout << endl;
cout << "Function Data:" << endl;
cout << "Object Address: " << this << " | Number: " << num << endl;
cout << "=====================" << endl;
}
void TestClass::func() {
class_member_function();
/*
* Example Print:
* =============================================
* Class Member Function:
* Container Vector Data:
* Object Address: 0x22fcc20 | Number: 10
* Function Data:
* Object Address: 0x22fcc20 | Number: 10 // As expected.
* =============================================
*/
container->tc_vec.emplace_back(4, container);
class_member_function();
/*
* Example Print:
* =============================================
* Class Member Function:
* Container Vector Data:
* Object Address: 0x22fd050 | Number: 10 // Address changed as expected, as a result of the vector's reallocation (reserve will solve this problem, but not a generic solution).
* Object Address: 0x22fd060 | Number: 4
* Function Data:
* Object Address: 0x22fcc20 | Number: 0 // Pay attention!! Address didn't change, and doesn't exists in the vector anymore.
* =============================================
*/
}
int main() {
TestContainer container;
container.tc_vec.emplace_back(10, &container);
container.tc_vec[0].func();
return 0;
}