2017-05-06 92 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++从基础开始的书。你能分享一本书吗? –