我有一个错误,似乎导致访问已被清除的内存。有 2 个类 - B 类(包含 C 类的结构实例和 D 类的 unique_ptrs)和 A 类,它包含 B 类对象的向量。以下是导致该错误的区域的代码结构:
void foo{
A localA(...);
bar(&localA);
baz(localA);
}
void bar(A* a) {
C c1 = constructLocalC1();
D d1 = constructLocalD1();
a.insertB(c1, &d1);
}
请注意, insertB 将调用 B 类的构造函数 - 类似于:
void A::insertB(C c, D* d) {
bVector.push_back(B(c, d));
}
B::B(C cIn, D* dIn) : c_(cIn) { d_ = make_unique<D>(*dIn); }
B {
public:
B(C c, D* d);
C c_;
std::unique_ptr<D> d_;
}
的实现constructLocalC1()
看起来像(类似 for constructLocalD1()
)
C constructLocalC1() {
C c1;
c1.blah = computeBlahParameter(); // blah is of type int
c1.bleh = computeBlehParameter(); // bleh is of type double
return c1;
}
观察结果是,当 baz 尝试访问 localA 中存在的 c1(的副本)时,其中的值已损坏,并且与 bar 设置的值不同。我从这个观察中得出的结论是,存储 B 的向量正在存储一个已被取消分配的元素。
我知道通过这里的代码片段理解根本原因有点复杂,因为这是高度抽象的 - 很高兴提供所需的更多具体细节。
此代码片段中的潜在陷阱和内存泄漏原因是什么?什么是调试的好方法?