c++:分段错误(核心转储)
c++: segmentation fault (core dumped)
我正在尝试使用指针和模板在 C++ 中实现动态数组,以便我可以接受所有类型。该代码在 int
下运行良好,但在使用 string
时会出错。我在网上尝试了其他 SO 问题,但对我的场景一无所知。
代码:
#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;
在您插入第 5 个项目之前 filledIndex
是 3
< 4
(capacityIndex
)。这导致 arrPtr[4]
被访问(越界访问,因为它的范围当前是 [0..3])。
通过最初将 filledIndex
设置为 0
并将 arrPtr[++filledIndex] = n;
更改为 arrPtr[filledIndex++] = n;
来修复它
您应该注意到您的代码存在严重缺陷:内存泄漏、有问题的名称和样式等。您可能希望 post 其固定版本为 https://codereview.stackexchange.com/。
我正在尝试使用指针和模板在 C++ 中实现动态数组,以便我可以接受所有类型。该代码在 int
下运行良好,但在使用 string
时会出错。我在网上尝试了其他 SO 问题,但对我的场景一无所知。
代码:
#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;
在您插入第 5 个项目之前 filledIndex
是 3
< 4
(capacityIndex
)。这导致 arrPtr[4]
被访问(越界访问,因为它的范围当前是 [0..3])。
通过最初将 filledIndex
设置为 0
并将 arrPtr[++filledIndex] = n;
更改为 arrPtr[filledIndex++] = n;
您应该注意到您的代码存在严重缺陷:内存泄漏、有问题的名称和样式等。您可能希望 post 其固定版本为 https://codereview.stackexchange.com/。