2017-05-06 71 views
3

我用cpp編寫了一個程序,用cin讀取字符串並將它們保存在分配的內存中。我需要做的額外工作是處理輸入大小超過預期的情況。當我測試代碼時,它不顯示最終的內存保存的內容,不能自動終止。這是代碼。在C++中分配內存時出錯

#include <iostream> 
#include <memory> 
using namespace std; 
int main(){ 
    allocator<string> sa; 
    cout << "Please input the amount of words" << endl; 
    int count; 
    cin >> count; 
    auto p = sa.allocate(count); 
    cout << "Please input the text" << endl; 
    string s; 
    auto q = p; 
    while(cin >> s){ 
     if (q == p + count) { 
      auto p2 = sa.allocate(count * 2); 
      auto q2 = uninitialized_copy_n(p, count, p2); 
      while (q != p) { 
       sa.destroy(--q); 
      } 
      sa.deallocate(p, count); 
      p = p2; 
      q = q2; 
      count *= 2; 
     } 
     sa.construct(q++, s); 
    } 
    for (auto pr = p; pr != q; ++pr) { 
     cout << *pr << " "; 
    } 
    cout << endl; 
    while (q != p) { 
     sa.destroy(--q); 
    } 
    sa.deallocate(p, count); 
    return 0; 
} 
+0

爲什麼使用分配器呢?我很驚訝你使用這個而不是新的甚至更好的(!),像std :: vector和std :: string這樣的容器。 –

回答

6

爲什麼使用allocator?這個模板不應該直接在代碼中使用。它假設被用來調整STL容器的行爲。你是新手,所以不要碰它。此功能適用於極端情況下的高級開發人員。

只需使用std::vector<string>它具有您需要的所有功能。

cout << "Please input the amount of words" << endl; 
int count; 
cin >> count; 
auto v = vector<string> {}; 
v.reserve(count); 

string s; 
while (cin >> s) 
{ 
    v.push_back(s); 
} 
+0

添加一個'reserve'調用。 – LogicStuff

+0

感謝您的建議。我試圖這樣做,因爲C++入門書煽動我這樣做。事實上,我是一個新手:) – Saeron

+0

顯然,這本書的作者想要證明他有多聰明,而不是寫一本教C++從基礎開始的書。你能分享一本書嗎? –