1

我正在尝试学习 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;
}
4

3 回答 3

4

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

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

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

于 2013-10-30T19:46:30.047 回答
1

您的问题出在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<X>摆脱目前必须处理的所有指针。

于 2013-10-30T19:48:58.837 回答
1

您有 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;
}
于 2013-10-30T19:52:26.870 回答