为什么数组不打印第一个元素?

问题描述 投票:0回答:1

我正在尝试实现一个行为类似于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个回答
0
投票

这两行是一个主要问题,将导致未定义行为下降:

dynamicArray = tempArr;
delete[] tempArr;

在第一行之后,对dynamicArray的赋值,您有两个指针(dynamicArraytempArr)指向指向相同的内存!

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

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

delete[] dynamicArray;
dynamicArray = tempArr;

0
投票

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;
}

0
投票

您正在代码中调用未定义的行为。具体来说,您将dynamicArray设置为指向与tempArr相同的内存地址,然后立即指向该内存。此后任何取消引用该内存的尝试均未定义。相反,您要做的是实际delete,然后再设置delete [] dynamicArray

© www.soinside.com 2019 - 2024. All rights reserved.