类解构函数和指针
Class deconstructor and pointers
我们在大学里写了一段代码(学习面向对象程序(。我们写了这门课,问题是,根据我和我们的老师的理解,程序应该在以下情况下崩溃,但就我而言,它不会。
问题是这条线是罪魁祸首
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++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址