[英]c++ when creating new object: iterator not incrementable
我正在處理一個任務,以創建一群兔子,它們可以在每個回合中繁殖。 因此,我定義了一個Bunny
類(單獨),然后定義了一個帶向量指向不同兔子的Troop
類。 我的問題是,每次使用new
在循環中創建對象Bunny時,都會出現錯誤消息:
“調試斷言失敗!! ...矢量迭代器不可遞增...”
這是我的代碼示例:
class Bunny {
private:
string sex;
string color;
string name;
int age;
public:
string getname() { return name;};
Bunny(); // constructor
};
class Troop {
private:
vector<Bunny *> bunpointer;
vector<Bunny *>::iterator it;
public:
void newbunny();
void multiply();
};
void Troop::newbunny() {
Bunny * bun; // pointer to the Bunny class
bun = new Bunny;
cout << "Bunny " << bun->getname() << " is born! \n";
bunpointer.push_back(bun);
}
void Troop::multiply() {
it = bunpointer.begin();
while(it!=bunpointer.end()) {
cout << (*it)->getname() << " gave a birth. ";
newbunny();
++it;
}
it = bunpointer.begin();
}
因此,如果我在開始時創建了5個兔子,並調用了Troop::multiply
函數,則應該有10個兔子。 一個有趣的觀察是,該錯誤將在2個兔子出生后發生。
我認為問題可能在於在迭代器循環中使用new
創建新對象。 new
函數可能會以某種方式中斷迭代器指針*it
。 但是我不確定是否是這種情況,如果確實如此,如何處理。
修改:所以實際上是使用push_back()
的問題,這可能會使iterator
無效!
先感謝您!!
看來您正在嘗試遍歷std::vector
時對其進行修改。 由於多種原因,這通常不是一個好主意。
特別是,當您在迭代器的循環內調用newbunny()
,用於保留的迭代器可能會失效,因為矢量可能會在push_back
期間調整大小。
有關詳細信息,請參見此問題 。
正如其他人提到的, push_back()
是您的罪魁禍首,而不是new
。
一種緩解疾病的方法是:
size_t const max(bunpointer.size());
for(size_t i(0); i < max; ++i)
{
cout << bunpointer[i]->getname() << " gave a birth. ";
newbunny();
}
之所以可行,是因為您只在現有向量的末尾添加了新的兔子。 這些新兔子不會被循環考慮(最大值不會更改,因為您調用newbunny()...),並且[i]
訪問使用了向量的當前狀態。
如果您要刪除項目,則該循環將不起作用...
附帶說明一下:“ bunpointer”這個名稱不是很清楚……它不是指針,它是指針的向量。
1)除非您有理由,否則您的代碼根本不需要使用new
。 代碼變得更容易,並且沒有內存泄漏的機會。 另外,除非您能說明理由,否則我認為Troop類中不需要迭代器成員。
2)至於您眼前的問題,只需使用非迭代器依賴循環即可。 換句話說,是一個簡單的循環,從0到當前的兔子數量減去1。
這是一個例子:
#include <vector>
//...
class Troop {
private:
std::vector<Bunny> bunpointer;
public:
void newbunny();
void multiply();
};
void Troop::newbunny() {
bunpointer.push_back(Bunny());
}
void Troop::multiply() {
size_t siz = bunpoiner.size();
for (size_t i = 0; i < siz; ++i ) {
newbunny();
cout << (*it)->getname() << " gave a birth. ";
}
}
newbunny()函數僅使用默認構造函數創建一個Bunny()並將該項添加到向量中。
如果要使用在插入項目時不會使迭代器無效的容器,則可以使用std::list
而不是std::vector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.