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
作业都在 1node
上。 当第一个循环完成时,无论最后一个值分配给 1node
的x
,这就是你的第二个循环打印出 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;
}
但是,你为什么要使用指针? 这根本不是一个值得使用指针的好例子。 您应该创建node
对象的vector
,而不是指向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
}
你忘了声明函数 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
可以让您不必为删除分配的内存而烦恼。
相关文章:
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- VI工作室代码错误无法打开输出文件主.exe
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 有关矩阵的代码错误导致分段错误(内核转储)
- C++ Schannel POST 400 错误代码错误请求
- Java 本机访问代码错误:"Invalid memory access"
- 代码错误修改
- C++代码错误分配
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 我的代码错误类型警告 1 警告 C4018 和更多错误
- 代码错误(从 1 到 100 找到质数)
- OpenCV VisualStudio,C 代码错误尝试访问像素
- 当我使用的教程完全没有错误时,为什么我的代码错误
- 简单的NOOB C 输入/输出问题:代码错误
- 为什么enumProcessModules返回false值和299代码错误
- WinhttpSetoption()失败设置TLSV1.2,带有错误代码错误_internet_incorrect_ha
- 苹果安全传输代码错误
- C++ - 国际象棋主教移动代码错误
- 导入Python库时,嵌入了Python代码错误
- 编译提升C 代码错误