簡體   English   中英

關於C ++中的動態內存

[英]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 );
}

請注意,這里沒有newdelete表達式。 使用諸如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM