数组没有使用新操作符调整大小

  • 本文关键字:操作符 调整 数组 c++
  • 更新时间 :
  • 英文 :


我想将动态数组实现为一个类。

我写了一个在数组末尾添加元素的方法:

void DynamicArray::addElementAtEnd() {
cout << "nPodaj liczbe calkowita: ";
int* number = new int;
cin >> *number;
if (DynamicArray::array == NULL) {
DynamicArray::array = new int[1];
DynamicArray::array[0] = *number;
delete number;
(*DynamicArray::size)++;
return;
}
int* buff = new int[*DynamicArray::size + 1];
memcpy(buff, DynamicArray::array, (*DynamicArray::size) * sizeof(int));
delete[] DynamicArray::array;
buff[(*DynamicArray::size)] = *number;
DynamicArray::array = buff;
(*DynamicArray::size)++;
delete number;
return;
};

这是DynamicArray类的.h文件:

#include <iostream>
using namespace std;
class DynamicArray {
public:
int* array;
int* size;
public:
DynamicArray() {
DynamicArray::size = new int;
*DynamicArray::size = 0;
};
void handleMenu();
void readFromFile();
void addElementAtEnd();
void addElementAtBeginning();
void addAtIndex(int index);
void deleteElementAtEnd();
void deleteElementAtBeginning();
void deleteElementByIndex(int index);
void showAllElements();
void showElementAtIndex(int index);
void findElementByValue(int value);
};

问题是,这个方法只添加了第一个元素,但如果我尝试添加更多元素,则什么都不会发生。我调试了它,问题开始于这一行:

int* buff = new int[*DynamicArray::size + 1];

我不知道为什么,但这条线似乎并没有创建一个更大的数组。

我寻找了一些解决方案,似乎问题与使用*DynamicArray::size + 1而不是变量有关,或者我没有正确使用它

实际问题是您没有将array初始化为NULL。因此,当您在第一次迭代中检查array是否为NULL时,它通常不是。

最小解决方案:

DynamicArray::DynamicArray() {
this->size = 0; // You should use 'size' like an int, not a pointer
this->array = NULL;
}
// Or using the Member Initializer List (by @user4581301)
DynamicArray::DynamicArray(): size(0), array(nullptr) {}

注:NULLnullptr的区别

其他简单的解决方案可以是检查size是否等于0,而不是检查array是否为NULL

上述更改将解决您的问题,但您的代码仍然可以改进。考虑其他用户的评论。并确保释放每个动态分配的内存。

让我们来解决各种问题。

class DynamicArray {
public:
int* array;
int* size;
public:
DynamicArray() {
DynamicArray::size = new int;
*DynamicArray::size = 0;
}
};

这里有几件事。首先,正如其他人所建议的那样,没有任何理由将大小作为指针。

接下来,在声明字段时始终初始化字段是一个很好的指导原则。

所以这段代码可以看起来像这样:

class DynamicArray {
public:
int* array = nullptr;
int size = 0;
public:
DynamicArray() {
}
};

之后,请使用nullptr而不是NULLNULL来自C,但C++中的正确值是nullptr

现在,让我们来看一下这段代码。

void DynamicArray::addElementAtEnd() {
cout << "nPodaj liczbe calkowita: ";
int* number = new int;
cin >> *number;
if (DynamicArray::array == NULL) {
DynamicArray::array = new int[1];
DynamicArray::array[0] = *number;
delete number;
(*DynamicArray::size)++;
return;
}
int* buff = new int[*DynamicArray::size + 1];
memcpy(buff, DynamicArray::array, (*DynamicArray::size) * sizeof(int));
delete[] DynamicArray::array;
buff[(*DynamicArray::size)] = *number;
DynamicArray::array = buff;
(*DynamicArray::size)++;
delete number;
return;
};

除了函数末尾的额外冒号(完全没有必要(,这比它需要的要复杂得多。首先,去掉int指针。这太荒谬了。

void DynamicArray::addElementAtEnd() {
cout << "nPodaj liczbe calkowita: ";
int number = 0;
cin >> number;
int * newArray = new int[size + 1];
newArray[size] = number;
if (array != nullptr) {
for (int index = 0; index < size; ++index) {
newArray[index] = array[index];
}
delete [] array;
}
array = newArray;
++size;
}

最后一条注释——将新值作为参数传递给方法会更有意义,并且调用测试代码应该获得您添加的值。但你只是在学习,所以这很有效。

还要注意的是,您不应该以现有的方式指定类:DynamicArray::array。没有人这么做。按照我上面的方法做。

最新更新