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

C++ pointer problem : How to fix bugs in these codes?

#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.

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

您只分配了 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 个对象,而不是 vector 个指向 node 个对象的指针,例如:

#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
}

您忘记声明函数 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;

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

您需要为每个值创建一个节点类型的新对象 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让你不用为删除分配的内存而烦恼