나는 그것이 이상한 경우 지우는 방법을 호출 할 때 올바른 소멸자가 올바른 개체에 대해 호출되는 stl 벡터에 실제로 이상한 문제가 있습니다.
벡터의 이상한 문제
for(vector<Category>::iterator iter = this->children.begin(); iter != this->children.end(); iter++)
{
if((*iter).item == item)
{
this->children.erase(iter);
return;
}
-------------------------
}
그것은 검색 할 몇 가지 항목을 가지고있는 벡터의 요소를 발견하고, 벡터의 요소 말했다 제거합니다 단순한 기능입니다 :
내 코드는 다음과 같이 보입니다. 내 문제는 erase 함수가 호출되어서 iterator가 가리키고있는 객체가 파괴되고, 잘못된 소멸자가 호출되는 것보다 낫다. 더 구체적으로 벡터의 마지막 요소의 소멸자가 호출되고 실제 객체가 제거되지 않습니다. 따라서 메모리는 여전히 벡터의 요소가 될 잘못된 개체에서 제거되고 벡터에서 제거 된 실제 개체는 여전히 모든 메모리가 그대로 유지됩니다.
개체의 costructor은 다음과 같습니다
Category::Category(const Category &from)
{
this->name = from.name;
for(vector<Category>::const_iterator iter = from.children.begin(); iter != from.children.end(); iter++)
this->children.push_back((*iter));
this->item = new QTreeWidgetItem;
}
그리고 당신은 아마 표준 알고리즘을 사용한다
Category::~Category()
{
this->children.clear();
if(this->item != NULL)
{
QTreeWidgetItem* parent = this->item->parent();
if(parent != NULL) parent->removeChild(this->item);
delete this->item;
}
}
복사 할당 연산자는 어떤 모양입니까? –
작동하는 최소한의 예가 훨씬 더 환영받을 것입니다. – karlphillip
복사 보증 연산자가 없으므로 실제로 사용하지 않습니다. –