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
의 소멸자가 호출 될 때 문제가 발생합니까? 반면에 우리는
A*
과
B*
에 대해 정확히 두 개의
delete
을 호출하기 때문에
Data
의 소멸자가 깊지 않다면 - 그리고 어쩌면 그것이 내가 명확한 설명을 필요로하는 곳일 수 있습니다. 우려는 잘못 되었습니까? 예를 들어 구조체
A
과
B
에는 정의 된 소멸자가 없으므로 깊이가 없다는 것을 알았습니다. 그러나 이것이 포인터 데이터가 해제되는지 아닌지 확실하지 않습니다. 늘 그렇듯이 전문가의 통찰력을 인정하십시오.
시간 내 주셔서 감사합니다.
'성 : 벡터 <표준 :: unique_ptr >':
some_func
의 코드는 다음과 같이 읽을 수 있습니다. 문제 해결됨. 또한, 다른 의미가 필요한 경우'std :: shared_ptr또한 valgrind를 실행하여 누출이 있는지 확인하십시오. – Homer6
@Ed S :'shared_ptr'실제로 좋은 생각입니다. –
MSalters