c++;:分段故障(堆芯转储) 我试图用指针和模板在C++中实现一个动态数组,这样我就可以接受所有类型。使用int时代码运行良好,但使用string时会出现错误。我在网上尝试了其他的SO问题,但对我的场景一无所获

c++;:分段故障(堆芯转储) 我试图用指针和模板在C++中实现一个动态数组,这样我就可以接受所有类型。使用int时代码运行良好,但使用string时会出现错误。我在网上尝试了其他的SO问题,但对我的场景一无所获,c++,arrays,string,pointers,dynamic-arrays,C++,Arrays,String,Pointers,Dynamic Arrays,代码: 经典: if(filledIndex

代码:

经典:

if(filledIndex
在插入第5项之前,
filledIndex
3
4(
capacityIndex
)。这将导致访问
arrPtr[4]
(由于其范围当前为[0..3],因此无法进行绑定访问)

首先将
filledIndex
设置为
0
并将
arrPtr[++filledIndex]=n;
更改为
arrPtr[filledIndex++]=n;

您应该注意,您的代码存在严重缺陷:内存泄漏、名称和样式有问题等。您可能希望将其固定版本发布到。

Classic:

if(filledIndex
在插入第5项之前,
filledIndex
3
4(
capacityIndex
)。这将导致访问
arrPtr[4]
(由于其范围当前为[0..3],因此无法进行绑定访问)

首先将
filledIndex
设置为
0
并将
arrPtr[++filledIndex]=n;
更改为
arrPtr[filledIndex++]=n;


您应该注意,您的代码存在严重缺陷:内存泄漏、名称和样式有问题等。您可能希望将其固定版本发布到。

分段错误的第一条规则:在调试器中运行您的程序。检查索引,您很可能在某个地方越界了(我有一个热门候选人,但我错了)你能更具体地说明错误发生在哪里吗?请注意,像valgrind这样的工具(用于Linux)对发现此类错误有很大帮助。我想Windows上一定存在一些等效的工具第一条分段错误规则:在调试器中运行程序。检查索引,你很可能在某个地方越界了(我有一个热门的候选者,但我错了)您能更具体地说明错误发生的位置吗?请注意,像valgrind这样的工具(用于Linux)查找此类错误非常有帮助。我想Windows上一定存在一些等效的工具。这不是UB的唯一原因。例如,
insert
中的“重新分配时复制”循环尝试复制容量的新值所需的项目数。@walnut是的。这是值得回答的,请确保我会对此进行投票。谢谢,这是帮助我前进。这不是UB的唯一原因。例如,
insert
中的“重新分配时复制”循环尝试复制容量的新值所需的项目。@胡桃木:没错。这值得回答,请确保我会投票支持。谢谢,这帮助我前进。
#include <iostream>
#include <string>
using namespace std;

template <typename T>
class dynamicIntArray
{
private:
    T *arrPtr = new T[4]();
    int filledIndex = -1;
    int capacityIndex = 4;

public:
    // Get the size of array
    int size(void);

    // Insert a data to array
    bool insert(T n);

    // Show the array
    bool show(void);
};

template <typename T> 
int dynamicIntArray<T>::size(void)
{
    return capacityIndex + 1;
}

template <typename T> 
bool dynamicIntArray<T>::insert(T n)
{
    if (filledIndex < capacityIndex)
    {
        arrPtr[++filledIndex] = n;
        return true;
    }
    else if (filledIndex == capacityIndex)
    {
        // Create new array of double size
        capacityIndex *= 2;
        T *newarrPtr = new T[capacityIndex]();

        // Copy old array
        for (int i = 0; i < capacityIndex; i++)
        {
            newarrPtr[i] = arrPtr[i];
        }

        // Add new data
        newarrPtr[++filledIndex] = n;
        arrPtr = newarrPtr;

        return true;
    }
    else
    {
        cout << "ERROR";
    }
    return false;
}

template <typename T> 
bool dynamicIntArray<T>::show(void)
{
    cout << "Array elements are: ";
    for (int i = 0; i <= filledIndex; i++)
    {
        cout << arrPtr[i] << " ";
    }
    cout << endl;

    return true;
}

int main()
{
    dynamicIntArray<string> myarray;

    myarray.insert("A");
    myarray.insert("Z");
    myarray.insert("F");
    myarray.insert("B");
    myarray.insert("K");
    myarray.insert("C");

    cout << "Size of my array is: " << myarray.size() << endl;

    myarray.show();
}
segmentaion fault (core dumped)
if (filledIndex < capacityIndex)
{
    arrPtr[++filledIndex] = n;