[英]About dynamic memory in C++
這是我為響應C ++ Primer練習而編寫的程序。 我不知道為什么它兩次將向量中的最后一個數字打印出來。
vector<int>* create_dyn_vec() {
return new vector<int>();
}
void give_value(vector<int>* ivec_ptr, istream& in) {
int i;
while (in) {
in >> i;
ivec_ptr->push_back(i);
}
}
void print(vector<int>* ivec_ptr) {
for (auto& i : *ivec_ptr)
cout << i << " " << endl;
}
int main() {
auto ivec_dyn_ptr=create_dyn_vec();
give_value(ivec_dyn_ptr, cin);
print(ivec_dyn_ptr);
delete ivec_dyn_ptr;
}
如果您遇到最后一個號碼重復的問題,請替換
while (in) {
in >> i;
只是
while( in >> i ) {
在將數字附加到向量之前,原始代碼不會檢查輸入操作是否成功。 因此,在文件末尾(輸入操作失敗),該數字不變,並被附加。
在替換代碼中in >> i
的表達式嘗試輸入操作並生成對該流的引用作為其表達式結果 。 該引用用作while
條件 ,當用作條件時,它將轉換為bool
。 流將該轉換定義為not in.fail()
產生not in.fail()
,其中fail
是成員函數,該成員函數告訴您對該流的最后一個i / o操作是失敗還是成功。
提示:您可以使用C ++ 引用來代替傳遞指針。
使用更多慣用的C ++,此代碼將類似於…
void load_from( istream& in, vector<int>& v )
{
int i;
while( in >> i )
{
v.push_back( i );
}
}
void print( vector<int> const& v )
{
for( auto const& i : v )
{
cout << i << endl;
}
}
int main()
{
vector<int> v;
load_from( cin, v );
print( v );
}
請注意,這里沒有new
或delete
表達式。 使用諸如vector
類的集合類的許多要點是,它可以自動執行內存管理 。 在頂部添加手動內存管理會達到目的。
免責聲明:我沒有嘗試編譯代碼。
因為std::istream
上文件條件的結尾是在您嘗試從它讀取后設置的,而不是在以下條件之前設置的:
while (in) {
in >> i;
ivec_ptr->push_back(i);
}
讀取文件中的最后一個值之后,請重新啟動while循環:
while (in) {
結果為true
,因為尚未達到文件條件的末尾。
in >> i;
ivec_ptr->push_back(i);
然后,您嘗試讀取下一個值。 該嘗試失敗,並在std::istream
上設置文件結束條件。 但是,盡管如此,您push_back()
的值設置為向量。 這恰好是您在文件中讀取的最后一個值,第二次有效地將其附加到向量中。
在下一次迭代中,文件條件的結尾將終止while
循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.