gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:14:54 25 4
gpt4 key购买 nike

这是我为响应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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com