在 C++ 中操作向量时出现分段错误

Posted

技术标签:

【中文标题】在 C++ 中操作向量时出现分段错误【英文标题】:Segmentation fault when operating a vector in c++ 【发布时间】:2013-10-30 19:40:41 【问题描述】:

我正在尝试学习 c++,我想用一个简单的程序将 X 实例的向量初始化为类成员,但是我遇到了分段错误...你能帮忙吗?

#include <iostream>
#include <vector>

class X 
    int _x;
    public:
    X(int i)  _x = i; 
    void print()  std::cout << this->_x << std::endl; 
    void xAdd()  _x++; 
;


class Y 
    std::vector<X*> _x;
    public:
    Y(int size) : _x(size) 
        for (int i = 0; i < size; ++i) _x.push_back(new X(1));
    
    void printAll() 
        for(unsigned int i = 0; i < _x.size()-1; i++) 
        _x[i]->print();
        
    
;

int main()
    Y *y = new Y(5);
    y->printAll();
    return 0;

【问题讨论】:

您的课程旨在泄漏内存。 _X 的元素指向的所有对象都需要手动释放。为避免这种情况,请改用智能指针(或根本不使用指针)。 【参考方案1】:

你用size空指针初始化_x;然后你将另一个size 有效指针推到它上面。然后printAll 尝试取消引用那些空指针。

要么删除初始化程序(可能添加_x.reserve(size); 以最小化分配);或者把循环体改成_x[i] = new X(1);

作为一般说明,您使用 new 的次数太多了。向量没有理由包含指针而不是对象,或者y 没有理由是动态的而不是自动的。

【讨论】:

【参考方案2】:

您有 2 次内存泄漏。除非必须,否则不要使用new

您在不需要时使用循环进行初始化。

您设置向量的初始大小(以及初始值),然后执行push_back。因此,第一个N 值是默认构造的(和NULL)。

您的printAll 函数将打印除最后一个元素之外的所有元素。

class X 

private:
    int _x;
public:
    X(int i)  _x = i; 
    void print()  std::cout << _x << std::endl;  // this-> is not needed
    void xAdd()  _x++; 
;

class Y 

private:
    std::vector<X> _x; // no need to store pointers, store the object itself
public:
    Y(int size) : _x(size, X(1)) // use the fill version of the constructor 
     

    // simple way to print (there are other ways to do the same thing)
    void printAll() 
    
        std::for_each(_x.begin(), _x.end(), [](const X& x)
        
            x.print();
        );
    
;

int main()

    Y y(5); // no need for heap allocation
    y.printAll();
    return 0;

【讨论】:

【参考方案3】:

您的问题出在Y 类的构造函数中:

class Y 
    std::vector<X*> _x;
    public:
    Y(int size) : _x(size)   // initializing the vector with size elements all set to nullptr
        for (int i = 0; i < size; ++i) _x.push_back(new X(1)); // pushing back size pointers to actual instances of X
    
    void printAll() 
        for(unsigned int i = 0; i < _x.size()-1; i++)  // iterating over the first size items of the vector which are the nullptrs and derefencing them.
        _x[i]->print();
        
    
;

您应该考虑将其设为std::vector&lt;X&gt; 以摆脱您目前必须处理的所有指针。

【讨论】:

以上是关于在 C++ 中操作向量时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中操作向量时出现分段错误

在 C++ 中比较来自向量的字符串时出现分段错误

对检索到的向量进行操作时出现分段错误

在 C++ 中使用向量时出现分段错误?

添加向量时出现分段错误。 (C++)

在 C++ 索引程序中使用向量时出现分段错误 11