【问题标题】:C++ segmentation fault using dynamic arrays of strings使用动态字符串数组的 C++ 分段错误
【发布时间】:2021-07-12 07:06:18
【问题描述】:

我的 string-dynamic-array.cpp 文件

#include <iostream>
#include <string>

class DynamicArray
{
public:
    DynamicArray()
    : mCapacity(1), mNumberOfElements(0)
    {
        mArray = new std::string[mCapacity];
    }

    DynamicArray(int size)
    : mCapacity(size), mNumberOfElements(0)
    {
        mArray = new std::string[mCapacity];
    }

    DynamicArray(const DynamicArray& array)
    : mCapacity(array.getCapacity()), mNumberOfElements(array.length())
    {
        mArray = new std::string[mCapacity];
        for (size_t i = 0; i < mCapacity; ++i)
        {
            mArray[i] = array.get(i);
        }
    }

    ~DynamicArray()
    {
        delete[] mArray;
    }

    void add(std::string element)
    {
        if (mNumberOfElements >= mCapacity)
        {
            expand();
        }

        mArray[mNumberOfElements++] = element;
    }

    std::string get(int index) const
    {
        if (index > mNumberOfElements)
        {
            std::string exception = std::to_string(index) + " index is out of bounds.";
            
            std::cout << exception;
            return std::string();
        }

        if (index < 0)
        {
            if (mNumberOfElements + index < 0)
            {
                std::string exception = std::to_string(index) + " index result in " + std::to_string(mNumberOfElements + index) + " which is out of bounds.\n";
                
                std::cout << exception;
                return std::string();
            }

            return mArray[mNumberOfElements + index];
        }

        return mArray[index];
    }

    int length() const
    {
        return mNumberOfElements;
    }

    int getCapacity() const
    {
        return mCapacity;
    }
private:
    int mCapacity;
    int mNumberOfElements;
    std::string* mArray;

    void initialize(int from)
    {
        for (size_t i = from; i < mCapacity; ++i)
        {
            mArray[i] = std::string();
        }
    }

    void expand()
    {
        mCapacity *= 2;
        std::string* temporaryArray = new std::string[mCapacity];

        for (size_t i = 0; i < mCapacity; ++i)
        {
            temporaryArray[i] = mArray[i];
        }

        delete[] mArray;

        mArray = temporaryArray;

        initialize(mNumberOfElements);
    }
};

int main()
{
    DynamicArray strings;
    strings.add("Hello");
    strings.add("World");

    for (size_t i = 0; i < strings.length(); ++i)
    {
        std::cout << strings.get(i) << std::endl;
    }
}

我的输出

$ clang++ tests/string-dynamic-array.cpp -o tests/string-dynamic-array && ./tests/string-dynamic-array
[1]    14950 segmentation fault (core dumped)  ./tests/string-dynamic-array

我遇到了分段错误。

据我所知,问题在于我在 expand() 函数中展开数组的代码。我认为它在for循环中,因为for循环的索引超出了原始数组的范围。

我用int 试过这个,它似乎工作正常。我怎样才能用字符串做到这一点?

【问题讨论】:

  • 您的expand 函数访问旧数组中超过其分配大小的元素。 mCapacity 已经是新容量,但旧数组只有一半大小
  • @UnholySheep 我明白,但我不知道如何处理。我是否应该创建另一个存储旧容量的变量,然后运行循环直到旧容量?
  • 这是一种解决方案,尽管将 i &lt; mCapacity 更改为 i &lt; mNumberOfElements 也应该有效
  • @UnholySheep 刚刚采用了oldCapacity 的方式,它工作正常,但我将使用mNumberOfElements,因为不需要oldCapacity 变量。谢谢

标签: c++ arrays string pointers dynamic-arrays


【解决方案1】:

正如 UnholySheep 所说。 我稍微改变了我的扩展函数,所以循环只运行到旧数组的大小。

更新扩展功能:

    void expand()
    {
        mCapacity *= 2;
        std::string* temporaryArray = new std::string[mCapacity];

        for (size_t i = 0; i < mNumberOfElements; ++i)
        {
            temporaryArray[i] = mArray[i];
        }

        delete[] mArray;

        mArray = temporaryArray;

        initialize(mNumberOfElements);
    }

【讨论】:

    【解决方案2】:

    在“expand”方法中,你删除了mArray,然后,你将temporaryArray复制到了它,而据我所知,mArray的句柄不再有效。您需要将temporaryArray 的句柄传递给mArray,以便将其用作新的扩展数组。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 2015-02-16
      • 2021-08-11
      • 2019-03-19
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多