c++ - 关于C++中的动态内存

标签 c++ c++11

这是我为响应C++ Primer 中的练习而编写的程序。我不知道为什么它会两次打印 vector 中的最后一个数字。

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 ) {

原始代码在将数字附加到 vector 之前不检查输入操作是否成功。因此,在文件末尾,输入操作失败的地方,数字不变,并被追加。

在替换代码中,表达式 in >> i 尝试输入操作并生成对流的引用作为其表达式结果。该引用用作 while 条件,当用作条件 时,它会转换为 bool。该转换由流定义为生成 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 这样的集合类的大部分意义在于它自动化内存管理。在顶部添加手动内存管理反而达不到目的。

免责声明:我没有尝试编译代码。

关于c++ - 关于C++中的动态内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36121550/

相关文章:

c++ - 嵌套的 if-else 不适用于自定义结构 c++

c++ - std::promise 通知多个客户端

c++ - 使用私有(private)继承时,以何种方式继承基础构造函数?

c++ - 缩小从 unsigned 到 double 的转换

c++ - 如何释放由 boost fast_pool_allocator 管理的内存?

c++ - If语句打印 worker 姓名

c++ - 从模板类赋值运算符访问私有(private)成员变量

c++ - 重载+运算符来模拟移动到下一个节点

c++ - Boost::测试和模拟框架

c++ - 为什么初始化列表不能作为main的参数?怎么提议呢?