c++ 从基类访问静态数组时出现Segfault

njthzxwz  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(214)

我有这样的想法:

template <typename Item>
class Base
{
public:
    Base(Item* arr, int size):
        m_data(arr),
        m_size(size)
    {
        for (int i = 0; i < size; ++i)
        {
            arr[i] = Item();
        }
    }
private:
    Item* m_data;
    int m_size;
};

template<typename Item, unsigned int Size=0>

class Derived
{
public:
    Derived():
        Base<Item>(m_storage, Size)
    {
    }
private:
    Item m_storage[Size]
};

我这样做的原因是我试图初始化存储以便在基类中使用(一个掩护投诉),我已经意识到这可能是错误的方式去做这件事,但我只是想知道为什么当基类试图写入数组时,我会得到一个seg错误。m初始化一个大小为3的变量,该变量是用string作为其项目类型导出的,并且它在for循环的第一次迭代中segfault。
还请注意,我认为这可能不是解决我的覆盖问题的方法,我有另一个解决方案,但我只是真的很好奇,为什么它会seg故障,因为它应该能够访问数组中的静态数据。
谢谢你的帮助。

ztmd8pv5

ztmd8pv51#

你的问题是初始化的顺序。
本声明:

arr[i] = Item();

假设左边的项已经被初始化,并且它的生命周期已经开始。例如,赋值运算符是一个赋值给一个已经被调用了构造函数的对象。
在你的情况下,这是不正确的。
如果我们看看派生对象:

class Derived
{
public:
    Derived():
        Base<Item>(m_storage, Size)   // Here you are calling the base class
                                      // constructor where the above assignment
                                      // is actually being done.

      // But there is an implied initialization of the array
      // m_storage (that happens here).
      //
      // Before this point the memory for this array of object of
      // type <Item> has not been initialized (ie. no constructors
      // have been called).
      //
      // Yet you are using the array in the base class constructor
      // above.
      //
      // Note the initialization of this object done automatically
      // does a very similar thing to what you are doing in the base
      // class. i.e. Every member of the array is initialized using
      // the default constructor.
    {
    }
private:
    Item m_storage[Size]
};

相关问题