C++ 指针问题:如何修复这些代码中的错误? [关闭]

Posted

技术标签:

【中文标题】C++ 指针问题:如何修复这些代码中的错误? [关闭]【英文标题】:C++ pointer problem : How to fix bugs in these codes? [closed] 【发布时间】:2020-09-21 13:40:26 【问题描述】:
#include <vector>
struct node
    int x;
;
node* temp = new node();
std::vector<node*> ptrs;
for (int i = 0; i < 10; i++)
    temp->x = i;
    ptrs.push_back(temp);

std::vector<node*>:: iterator j;
for (j = ptrs.begin(); j != ptrs.end(); j++)
    std::cout << (*j)->x;

delete temp;

这会将999999999 打印为输出。我想要123456789

修改它的最佳方法是什么?我的意思是,什么是最好的时尚?

【问题讨论】:

你的错误是什么?发生了什么你不想发生的事情?这看起来不会编译?请逐字包含您的编译器错误! 请编辑您的代码以包含minimal reproducible example 这将打印 999999999 作为输出。我想要123456789 提示:你创建了多少个节点? ptrs的所有元素都是指针,都指向同一个node,也指向temp。所以最后一个循环打印temp-&gt;x 十次。一般来说,复制指针不会复制或克隆指针指向的对象。 【参考方案1】:

您只分配了 1 个 node 对象,然后将 10 个 node* 指针存储到您的向量中,它们都指向该 1 个 node 对象。因此,在您的第一个循环中,对 x 的所有分配都在该 1 node 上。当第一个循环完成时,无论最后一个值分配给 1 nodex,这就是您的第二个循环打印 10 次。

对于您正在尝试的内容,您需要分配和释放 10 个单独的 node 对象,例如:

#include <vector>
struct node
    int x;
;
node* temp;
std::vector<node*> ptrs;
for (int i = 0; i < 10; ++i)
    temp = new node; // <-- MOVED HERE!!!
    temp->x = i;
    ptrs.push_back(temp);

std::vector<node*>::iterator j;
for (j = ptrs.begin(); j != ptrs.end(); ++j)
    std::cout << (*j)->x;

for (j = ptrs.begin(); j != ptrs.end(); ++j) // <-- ADD THIS LOOP!!!
    temp = *j;
    delete temp;

但是,你为什么要使用指针呢?这根本不是一个保证使用指针的好例子。您应该创建一个 vectornode 对象,而不是指向 node 对象的指针的 vector,例如:

#include <vector>
struct node
    int x;
;
std::vector<node> nodes;
for (int i = 0; i < 10; ++i)
    node temp;
    temp.x = i;
    nodes.push_back(temp);

std::vector<node>::iterator j;
for (j = nodes.begin(); j != nodes.end(); ++j)
    std::cout << j->x; // or (*j).x

或者:

#include <vector>
struct node
    int x;
;
std::vector<node> nodes(10);
std::vector<node>::iterator j;
for (j = nodes.begin(); j != nodes.end(); ++j)
    j->x = i; // or (*j).x

for (j = nodes.begin(); j != nodes.end(); ++j)
    std::cout << j->x; // or (*j).x

【讨论】:

【参考方案2】:

您忘记声明函数 main。在任何函数之外,您只能使用声明。所以至少这部分代码

for (int i = 0; i < 10; i++)
    temp->x = i;
    ptrs.push_back(temp);

std::vector<node*>:: iterator j;
for (j = ptrs.begin(); j != ptrs.end(); j++)
    std::cout << (*j)->x;

delete temp;

必须放在函数中。

这个循环

for (int i = 0; i < 10; i++)
    temp->x = i;
    ptrs.push_back(temp);

在向量中放置相同的指针。所以这个说法

    temp->x = i;

更改由同一指针temp 指向的同一对象的数据成员x,该指针的副本被推入向量中。也就是说,在这个循环之后,向量的所有元素都将指向同一个动态分配的对象。

你需要为每个值i创建一个类型节点的新对象。

该程序可以看起来例如以下方式

#include <iostream>
#include <memory>
#include <vector>

struct node
    int x;
;

int main() 

    std::vector<std::unique_ptr<node>> ptrs;

    for ( int i = 0; i < 10; i++ )
    
        ptrs.emplace_back( new node  i  );
    

    for ( const auto &p : ptrs )
    
        std::cout << p->x << ' ';
    
    std::cout << '\n';

    return 0;

它的输出是

0 1 2 3 4 5 6 7 8 9

使用智能指针unique_ptr 让您不必担心删除分配的内存。

【讨论】:

以上是关于C++ 指针问题:如何修复这些代码中的错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“没有重载函数需要 2 个参数”错误 C++

如何修复 C++ 中的“分段错误”错误

C++链表删除节点

如何解决 munmap_chunk():C++ 中的无效指针错误

如何将唯一指针向量中的每个元素排入队列? (C++)

指针数组中的 C++ 错误