我再次在上学,但是执行起来很慢,我不知道为什么park_car函数不起作用,我只是想进行测试,程序崩溃了……这是我的代码。PS:我无法更改***p2parkboxes,因为它像大多数其他变量一样在启动文件中提供。我只想看到0楼的第一个元素为:HH-AB1234。非常感谢您的帮助。PS2:我也不能使用std::string,它也不允许用于该任务。#include <iostream>#include <cstring>using namespace std;#define EMPTY "----------"class Parkbox{ char *license_plate; // car's license plate public: Parkbox(char *s = EMPTY); // CTOR ~Parkbox(); // DTOR char *get_plate(){return license_plate;}};class ParkingGarage{ Parkbox ***p2parkboxes; //int dimensions_of_parkhouse[3]; // better with rows,columns,floors int rows,columns,floors; // dimensions of park house int total_num_of_cars_currently_parked; int next_free_parking_position[3]; // PRIVATE MEMBER FUNCTION void find_next_free_parking_position(); public: ParkingGarage(int row, int col, int flr);// CTOR,[rows][columns][floors] ~ParkingGarage(); // DTOR bool park_car(char*); // park car with license plate bool fetch_car(char*); // fetch car with license plate void show(); // show content of garage floor // by floor};Parkbox::Parkbox(char *s ) { // CTOR license_plate = new char[strlen(s)+1]; strcpy(license_plate, s); //cout << "ParkBox CTOR" << endl;}Parkbox::~Parkbox() { // DTOR delete [] license_plate; //cout << "ParkBox DTOR" << endl;}ParkingGarage::ParkingGarage(int row, int col, int flr){ rows = row; columns = col; floors = flr; p2parkboxes = new Parkbox**[row]; for (int i = 0; i < row; ++i) { p2parkboxes[i] = new Parkbox*[col]; for (int j = 0; j < col; ++j) p2parkboxes[i][j] = new Parkbox[flr]; }}ParkingGarage::~ParkingGarage(){ for (int i = 0; i < rows; ++i) { for (int j = 0; j < columns; ++j) delete [] p2parkboxes[i][j]; delete [] p2parkboxes[i]; } delete [] p2parkboxes;}void ParkingGarage::show(){ int i,j,k; for (i = 0 ; i < floors; i++){ cout << "Floor" << i << endl; for (j=0;j<rows;j++){ for (k=0;k<columns;k++){ cout << p2parkboxes[j][k][i].get_plate() << " "; } cout << endl; } }}bool ParkingGarage::park_car(char*s){ p2parkboxes[0][0][0] = Parkbox(s); //test //p2parkboxes[0][0][0] = s; //test return true;}int main(void) { // a parking garage with 2 rows, 3 columns and 4 floors ParkingGarage pg1(2, 3, 4); pg1.park_car("HH-AB 1234"); /*pg1.park_car("HH-CD 5678"); pg1.park_car("HH-EF 1010"); pg1.park_car("HH-GH 1235"); pg1.park_car("HH-IJ 5676"); pg1.park_car("HH-LM 1017"); pg1.park_car("HH-MN 1111"); */ pg1.show(); /*pg1.fetch_car("HH-CD 5678"); pg1.show(); pg1.fetch_car("HH-IJ 5676"); pg1.show(); pg1.park_car("HH-SK 1087"); pg1.show(); pg1.park_car("SE-AB 1000"); pg1.show(); pg1.park_car("PI-XY 9999"); pg1.show(); */ return 0;} 最佳答案 您没有为Parkbox类声明副本构造函数。所以,线p2parboxes[0][0][0] = Parkbox(s)在堆栈上创建一些东西(带有char *指针的Parkbox实例)(并几乎立即将其删除)。要更正此问题,您可以定义Parkbox& operator = Parkbox(const Parkbox& other){ license_plate = new char[strlen(other.get_plate())+1]; strcpy(license_plate, other.get_plate()); return *this;}让我们来看看p2parboxes[0][0][0] = Parkbox(s)线。首先,调用构造函数,并在堆栈上创建Parkbox的实例(我们将其称为tmp_Parkbox)。 在此构造函数中分配了license_plate,假设它指向0xDEADBEEF位置。 复制发生(这很明显,因为这是用代码编写的东西),并且p2parboxes [0] [0] [0]现在包含tmp_Parkbox的精确副本。 现在,tmp_Parkbox的作用域结束,并且调用了tmp_Parkbox的析构函数,并在其中释放了tmp_Parkbox.license_plate(0xDEADBEEF ptr)。 p2parboxes [0] [0] [0]仍包含Parkbox的“有效”实例,而p2parboxes [0] [0] [0] .license_plate仍为0xDEADBEEF,这导致未定义的行为,如果在您之前进行了任何分配叫cout 底线:该行本身没有错,问题隐藏在'='运算符的实现细节中。在这一点上,最好使用std::string作为字符串,而不要使用混合了隐式C++复制/构造语义的尖锐,棘手和显式的C风格直接内存管理。如果将std::vector用于动态数组,则代码也将更好。
10-02 01:03