类设置有点奇怪,但它就是这样。当我尝试删除指向以下类的类实例的指针时,我遇到了问题:
class Foo {
Foo() { x = 5; }
~Foo() {}
int x;
}
class Bar : public Foo {
Bar() {}
~Bar() {}
void Test() { std::cout << "Hello World! " << x << std::endl; }
}
class Base {
Base() {}
~Base() {}
vector<Foo*> vec;
void Add(Foo* const &f) { vec.push_back(f); }
void Delete() {
delete vec[0];
vec[0] = NULL;
vec.clear();
}
}
class Derived : public Base {
Derived() { b = new Bar(); }
~Derived() {}
AddBar() { Add(b); }
Test() { b->Test(); }
Bar* b;
}
基本上,Derived
有Bar pointer
在某个时刻动态分配,然后传递到std::vector of Foo pointers
,Bar
从中导出vector
。 Derived
维护在vector
继承的类中,vector
用于执行vector
中所有元素的一大堆不同操作,但是现在我只显示一个条目。
问题在于我尝试从int main() {
Derived d;
d.Test(); // works fine, outputs: "Hello World! 5"
d.AddFoo();
d.Test(); // works fine, outputs: "Hello World! 5"
d.Delete();
d.Test(); // doesn't work fine, outputs: "Hellow World! -17891602
}
删除元素,如下所示:
Bar*
释放内存,看看整数现在是垃圾数据,但d仍然认为它NULL
存在,即使删除它并将其设置为Base.Delete()
中的Bar*
。 / p>
有没有办法让d
中的本地NULL
被释放/删除并设置为Derived
,而无需从{d.Test()
执行此操作1}}实例本身(即程序在尝试执行最终{{1}}类时崩溃)?
从技术上讲,我可以照原样做到这一点,但感觉凌乱而效率低下。
此外,如果有一个不错的答案并没有诉诸智能或独特的指针,我个人更喜欢这个,我不会讨论为什么。
如果这是唯一的解决方案,那我就全力以赴。
编辑当我第一次写它时,弄乱了Derived :: b,立即修复