【问题标题】:Why is the array not printing the very first element?为什么数组不打印第一个元素?
【发布时间】:2019-12-30 16:30:41
【问题描述】:

我正在尝试实现一个行为类似于 C++ 中的字符串数组的类。这是该类的代码:

class DynamicStringArray{
public:
    DynamicStringArray()
    :dynamicArray(nullptr), size(0){}
    int get_size(){return size;}
    void addEntry(const string& s);
    string operator[](const int &i){return dynamicArray[i];}
private:
    int size;
    string* dynamicArray;
};

这是addEntry(const string& s)的代码:

void DynamicStringArray::addEntry(const string& s){
    string* tempArr = new string[size + 1];
    for(int i = 0; i < size; i++){ tempArr[i] = dynamicArray[i];}
    tempArr[size] = s;
    size += 1;
    dynamicArray = tempArr;
    delete[] tempArr;
}

如果我想在“数组”中打印一个字符串,我会根据我的重载函数使用 [] 运算符。 但我的问题是第一个元素没有被打印出来。为什么会这样? 这是我的int main()

DynamicStringArray arr;
arr.addEntry("hello");
arr.addEntry("hey");
cout << arr[0] << endl; // doesn't print anything
cout << arr[1] << endl; // prints hey

【问题讨论】:

    标签: c++ arrays dynamic-memory-allocation


    【解决方案1】:

    addEntry 的末尾,将tempArr 分配给dynamicArray,然后将其删除。这意味着您正在从释放的内存中读取,这将导致未定义的行为。与其删除tempArr,不如删除不再需要的旧dynamicArray

    void DynamicStringArray::addEntry(const string& s){
        string* tempArr = new string[size + 1];
        for(int i = 0; i < size; i++){ tempArr[i] = dynamicArray[i];}
        tempArr[size] = s;
        size += 1;
        delete[] dynamicArray; // Here!
        dynamicArray = tempArr;
    }
    

    【讨论】:

      【解决方案2】:

      这两行是一个主要问题,会导致未定义的行为

      dynamicArray = tempArr;
      delete[] tempArr;
      

      在第一行之后,分配给dynamicArray 你有两个指针(dynamicArraytempArr)指向同一个内存!

      通过执行delete[] tempArr 会使dynamicArray 指针无效。

      您可能应该做的是首先删除为dynamicArray 分配的内存,然后进行分配:

      delete[] dynamicArray;
      dynamicArray = tempArr;
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多