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

Why is the array not printing the very first element?

本文关键字:元素 第一个 打印 数组 为什么      更新时间:2023-10-16

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

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

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

dynamicArray = tempArr;
delete[] tempArr;

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

通过执行delete[] tempArr可以使dynamicArray指针失效。

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

delete[] dynamicArray;
dynamicArray = tempArr;