为啥数组不打印第一个元素?
Posted
技术标签:
【中文标题】为啥数组不打印第一个元素?【英文标题】: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
【问题讨论】:
【参考方案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
你有两个指针(dynamicArray
和tempArr
)指向同一个内存!
通过执行delete[] tempArr
会使dynamicArray
指针无效。
您可能应该做的是首先删除为dynamicArray
分配的旧内存,然后进行分配:
delete[] dynamicArray;
dynamicArray = tempArr;
【讨论】:
以上是关于为啥数组不打印第一个元素?的主要内容,如果未能解决你的问题,请参考以下文章
C-为啥Struct数组的冒泡排序会跳过Array中的第一个元素?