好的..所以这让我很困惑。我正在处理一些我觉得不安全的遗留 C++ 代码部分,但我不能 100% 确定。这是一个片段,例如有风险的东西。
struct A {
A() : a_ptr(0) {}
A(some_type *ptr) : a_ptr(ptr) {}
const some_type *a_ptr;
};
struct B {
B() : b_ptr(0) {}
B(some_type *ptr) : b_ptr(ptr) {}
const some_type *b_ptr;
};
struct Data {
Data(...) {//-Stuff that doesn't invole aptr_list or bptr_list;
}
~Data() {
for(std::vector<A*>::iterator itr = aptr_list.begin(); itr != aptr_list.end() ++itr) {
delete *itr;
}
for(std::vector<B*>::iterator itr = bptr_list.begin(); itr != bptr_list.end() ++itr) {
delete *itr;
}
}
std::vector<A*> aptr_list;
std::vector<B*> bptr_list;
private:
Data(const Data&);
Data& operator=(const Data&);
};
然后在实现中,我发现:
void some_func(...) {
//-Inside some function
Data& d = get_data(...);
...
for(...) {
some_type *sptr = dynamic_cast<some_type*>(a_source_of_some_type_pointer);
A* a = new A(sptr);
B* b = new B(sptr);
d.aptr_list.push_back(a);
d.bptr_list.push_back(b);
}
}
我对sptr
上面的实现中使用的同一个指针有点不安;Data
当调用析构函数时,这会产生问题吗?另一方面,看起来我们有两个new
调用A*
和B*
恰好两个delete
s,所以如果析构函数Data
不深 - 也许这就是我需要澄清的地方,那么也许这毕竟是安全的,我的担心是错误的?我确实注意到结构A
,B
例如没有定义任何析构函数,所以我希望它不深。但我不确定这是否意味着他们的指针数据将被释放。一如既往地欣赏专家的见解。
感谢您的时间和兴趣。