Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建指针向量(C+;+;)时出现分段错误_C++ - Fatal编程技术网

C++ 创建指针向量(C+;+;)时出现分段错误

C++ 创建指针向量(C+;+;)时出现分段错误,c++,C++,我正在做一个程序,实现Dijkstra的算法 我首先要把txt文件中的数据读入指针数组的向量中,这样我就可以使用它了。(该文件包含#个顶点(本例中为7个)、顶点及其各自的边和权重)。见下文: 7 2 2 2 4 1 2 4 3 5 10 2 1 4 6 5 4 3 2 5 2 6 8 7 4 1 7 6 0 1 6 1 在my Main.cpp中,我尝试创建指向顶点对象的指针向量,如下所示: vector<Vertex*> vertices; vector

我正在做一个程序,实现Dijkstra的算法

我首先要把txt文件中的数据读入指针数组的向量中,这样我就可以使用它了。(该文件包含#个顶点(本例中为7个)、顶点及其各自的边和权重)。见下文:

7
2
2  2
4  1
2
4  3
5  10
2
1  4
6  5
4
3  2
5  2
6  8
7  4
1
7  6
0
1
6  1
在my Main.cpp中,我尝试创建指向顶点对象的指针向量,如下所示:

vector<Vertex*> vertices;
vector<Vertex*> vertices;
向量顶点;
然后,我尝试用以下代码填充向量:

for(int i=1;i < numVertices; i++)
    {   
        file >> numEdges;
        cout << "At vertex " << i << " the number of edges is " << numEdges << endl;
        vertices[i] = new Vertex();
        //Vertex newVertex;

        //Using the i counter variable in the outer for loop to identify
        //the what vertex what are currently looking at in order to read in the correct adjacent vertex and weight
        cout << "LENGTH OF VERTICES[i]: " << vertices.size() << endl;
        vertices[i]->setVertexNum(i);
        //newVertex.setVertexNum(i);

        for(int j=1;j<=numEdges;j++)
        {
            file >> adjacentVertex;
            cout << "The adjacent vertex is: " << adjacentVertex << endl;


            file >> weight;
            cout << "The weight is: " <<  weight << endl;
            cout << endl;

            vertices[i]->setAdjacentVertex(adjacentVertex, weight);
        }
        //cout << "LENGTH OF VERTICES[i]: " << vertices.size() << endl;
        vertices.push_back(vertices[i]);
    }
for(int i=1;i>numEdges;

你为什么在最后一行这样做

    vertices.push_back(vertices[i]);
您已经在顶点[i]处有了顶点,为什么还要在最后一次插入它?这将导致错误,因为您已为第i个条目分配了内存,但“向后推”将尝试再次放入第(i+1)个条目,并且该内存未分配。分段错误意味着程序试图访问未经授权的内存

正如其他人提到的,数组、向量或类似容器的起始循环应该从0开始

编辑

当你使用

    vector<Vertex*> vertices(numVertices + 1, NULL); 

第i个元素被推到第(i+1)个位置。但在前面的例子中,没有(i+1)当i=numVertices时的第个元素,因此在尝试在不可用的内存位置写入时发生了段错误。

您没有提供足够的信息来明确回答您的问题,但我可以指出代码中的一些明显缺陷

“在my Main.cpp中,我试图创建指向顶点对象的指针向量,如下所示:

vector<Vertex*> vertices;
vector<Vertex*> vertices;
由于某种原因,您的代码在1基偏移上运行:

for(int i=1;i < numVertices; i++)
您的代码似乎正是这样做的:

for(int i=1;i < numVertices; i++)
{   
    ...
    vertices[i] = new Vertex();
这将一次性预先调整向量的大小,并在一次弹出中用
num属性
默认初始化值填充它。既美观又高效。或者您可以执行以下操作:

vertices.reserve(numVertices);
for ( ... ) {
    Vertex* newVert = new Vertex();
    vertices.push_back(newVert);
这会告诉向量准备成为
numVertices
big,但实际上不会增加“size()”,这样就避免了向量在增长时必须在内存中移动

但是,通过正确使用向量,实际上可以避免所有这些新的/删除的麻烦:

vector<Vertex> vertices;
...
vertices.resize(numVertices);
或者,如果您使用的是C++11,则可以使用“emplace_back”,这是一个表示“在后面创建一个新的向量元素,下面是它的构造函数参数”的函数:

类顶点{
大小m_vertNum;
浮动m_x,m_y;
公众:
顶点(大小\u t顶点数、浮点x、浮点y)
:m_vertNum(vertNum)
,m_x
,m_y
{
}
};
向量顶点;
尺寸公差=10;
顶点保留(numVertices);
对于(大小i=0;i
很抱歉,这不是一个答案,而是一个可能导致答案的重要建议。我想我已经重复了很多次了,我应该写一篇关于这个的博客文章。 为什么你认为你需要一个指针向量

指针的向量是非常少的必要的,而且它们很难管理,特别是如果你是C++初学者。Dijkstra的算法不是你需要的例子之一。由于某种原因,我看到C++初学者使用的关键字“代码<新< /代码>,就像在java中一样,他们似乎不理解C++中你是负责的。内存管理。这很可能是问题的根源


我的建议是:尝试用
std::vector
替换
std::vector
来实现完全相同的算法"你的StEngbug问题是通过它来消失的。<为什么你在1开始循环?C++中的数组是从0开始索引的。这就是为什么我们有调试器。当然,有人可以为你发布答案,但是这又如何帮助你解决如何解决你自己的问题?你试过调试器吗?在哪一行代码发生分段错误?@anJacinto已经使用了调试器,而且这里的答案通常包含信息丰富的答案,这些答案不仅对我有帮助,而且还告诉我出错的原因。这就是我使用StackOverflow的原因,我假设对我们大多数人来说也是如此。当然,我想你应该知道程序崩溃的确切原因。也许你可以发布自己的答案并接受它。希望它足以描述你是如何调试它的,新程序员也将学习如何像世界上其他程序员一样使用调试器。+1用于使用顶点向量,并建议
reserve
方法。+1用于对可怜的问题。-1:你的编辑是错误的,
std::vector vertices(n+1,NULL);
没有“为(n+1)个项目分配内存”。看,这就是我说的问题…如果你编辑你的帖子,我会取消我的否决票。不用担心。谢谢@Sh3ljohn,我更新了我的答案。我的意思是为numVertices+1个指针预留空间,而不是实际的项目。
std::vector<int> v;
int i = v[23]; // may crash; "undefined behavior".
for(int i=1;i < numVertices; i++)
{   
    ...
    vertices[i] = new Vertex();
vertices.resize(numVertices);
vertices.reserve(numVertices);
for ( ... ) {
    Vertex* newVert = new Vertex();
    vertices.push_back(newVert);
vector<Vertex> vertices;
...
vertices.resize(numVertices);
for (size_t i = 0; i < vertices.size(); ++i) {
    Vertex& vert = vertices[i]; // 'vert' is now a short-cut alias to vertices[i].
    vert.setVertNum(i);
}
class Vertex {
    size_t m_vertNum;
    float m_x, m_y;
public:
    Vertex(size_t vertNum, float x, float y)
        : m_vertNum(vertNum)
        , m_x
        , m_y
    {
    }
};

vector<Vertex> vertices;
size_t numVertices = 10;
vertices.reserve(numVertices);
for (size_t i = 0; i < numVertices; ++it) {
    vertices.emplace_back(/*vertNum*/ i, /*x*/ float(i * 3), /*y*/ float(i * 2));
    Vertex& vert = vertices.back();
    ...
}