OK ..所以这让我困惑。我正在处理一些遗留的C++代码部分,我有一种感觉是不安全的,但我不是100%确定的。这里有一个片段,例如有风险的东西。关于删除C++指针
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
的结构没有定义任何析构函数,所以我希望它不深。但我不确定这是否意味着它们的指针数据将被释放。一如既往地欣赏专家的见解。
谢谢你的时间和兴趣。
'ST ::矢量<性病::的unique_ptr >'。问题解决了。另外,如果你需要不同的语义,'std :: shared_ptr'。 –
此外,Valgrind的运行,以确定是否有任何泄漏 – Homer6
@Ed S:'的shared_ptr'的确看起来像一个好主意。 –
MSalters