我们正在大学里编写代码(了解面向对象程序)。我们写了这堂课,问题是,根据我和老师的理解,程序应该在以下情况下崩溃,但就我而言,不是这样。
问题是这条线是罪魁祸首
DynamicArray d, f;
f = d;
据他说(附加了代码的其余部分),因为当main结束时,解构函数先删除f然后去往d,但是由于在两种情况下指针都指向相同的mem位置,现在在尝试删除它时应该给出错误信息,因为那里什么都没有。...但是我的编译器可以完美地运行代码。我正在使用gcc编译器。 Denconstructor在课程结束时,剩下的就是填充动态数组。
#include <iostream>
#include <ctime>
class DynamicArray{
private:
int *arr;
int size, cap; //cap is the physical size, size is number of elements
public:
DynamicArray(){
arr = nullptr;
size = cap = 0;
}
DynamicArray(int i){
cap = i;
size = 0;
arr = new int[cap];
}
void pushback(int j){
if(cap == 0){
arr = new int[cap];
arr[0] = j;
size++;
cap++;
}
else if(size < cap){
arr[size] = j;
size++;
}
else if(size == cap){
int *arr2 = new int[cap * 2];
int i;
cap *= 2;
for(i = 0; i < size; i++){
arr2[i] = arr[i];
}
arr2[i++] = j;
delete[] arr;
arr = arr2;
}
}
void print(){
for(int i = 0; i < size; i++)
std::cout << arr[i] << " ";
}
~DynamicArray(){
if(arr != nullptr)
delete[] arr;
}
};
int main(){
DynamicArray d, f;
srand(time(nullptr));
int n = rand() % 5;
for(int i = 0; i < n; i++){
d.pushback(rand() % 10);
}
f = d;
f.print();
std::cout << std::endl;
d.print();
return 0;
}
最佳答案
您的代码会导致所谓的“未定义行为”。基本上,这意味着任何事情都可能发生,包括什么也不会发生或者什么都不容易观察到。要更精确地定义“未定义的行为”,您必须检查例如C ++标准,但此处也有许多与此术语有关的讨论。
尝试使用例如运行代码valgrind
,它将告诉您代码已损坏。
关于c++ - 类的析构函数和指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49131767/