c++:分段错误(核心转储)

Posted

技术标签:

【中文标题】c++:分段错误(核心转储)【英文标题】:c++: segmentation fault (core dumped) 【发布时间】:2020-01-08 13:09:19 【问题描述】:

我正在尝试使用指针和模板在 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)

【问题讨论】:

分段错误的第一条规则:在调试器中运行您的程序 检查你的索引,你很可能在某个地方越界(我有一个热门候选人,但我错了) 您能否更具体地说明错误发生的位置? 请注意,valgrind(适用于 Linux)之类的工具对于查找此类错误非常有帮助。我想 Windows 上一定存在一些等效的工具 【参考方案1】:

经典Off-by-one error:

if (filledIndex < capacityIndex)

    arrPtr[++filledIndex] = n;

在您插入第 5 项之前,filledIndex3 4 (capacityIndex)。这导致arrPtr[4] 被访问(超出范围的访问,因为其范围当前为 [0..3])。

通过最初将filledIndex 设置为0 并将arrPtr[++filledIndex] = n; 更改为arrPtr[filledIndex++] = n; 来修复它

您应该注意到您的代码存在严重缺陷:内存泄漏、有问题的名称和样式等。您可能希望将其修复版本发布到https://codereview.stackexchange.com/。

【讨论】:

这不是导致 UB 的唯一原因。例如,insert 中的重新分配复制循环尝试复制与容量的 new 值一样多的项目。 @walnut 没错。这是值得回答的,请确保我会投票。 谢谢你,这帮助我前进。

以上是关于c++:分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

C++ 的核心转储分段错误

C++ 代码的分段错误(核心转储)

c++:分段错误(核心转储)

C++ 地图分段错误(核心转储)

C++ std 线程和列表分段错误(核心转储)

分段错误(核心转储) - 无法访问的计数器值