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