取消分配数组会导致退出11代码

时间:2018-09-09 16:09:57

标签: c++ pointers destructor

我正在建立一个由车辆,陈列室和经销商组成的项目。我已经建立了类,并且正在测试我的方法GetAveragePrice()

float Dealership::GetAveragePrice()

此方法运行良好:

Dealership dealership("COP3503 Vehicle Emporium", 3);
dealership.AddShowroom(&showroom);
dealership.AddShowroom(&secondary);
dealership.AddShowroom(&third);

cout << "Using just the GetAveragePrice() function\n\n";

cout << "Average price of the cars in the dealership: $" << std::fixed << std::setprecision(2);
cout << dealership.GetAveragePrice();

输出为

Using just the GetAveragePrice() function

Average price of the cars in the dealership: $27793.60

这是我想要的预期输出,但被告知我内存泄漏,并且必须包含一个析构函数以释放我的* Showroom showroomList 指针(在Dealership构造函数中将其初始化为以下内容) :

this->showroomList = new Showroom[maxNumOfShowrooms];

因此,我将析构函数编写如下:

Dealership::~Dealership()
{
    delete [] showroomList;
}

现在,没有任何内存泄漏,但是我没有得到预期的输出和退出代码11:

Using just the GetAveragePrice() function


Process finished with exit code 11

有人知道为什么这个析构函数搞乱了我的输出吗?

1 个答案:

答案 0 :(得分:1)

此版本在其析构函数中的最后一个实例仅删除一次。

std::unique_ptr<ShowRoom> Dealership::showroomList;

Dealership::Dealership(size_t maxNumOfShowrooms)
           :showroomList(std::unique_ptr<ShowRoom>(new Showroom[maxNumOfShowrooms]))
{

}

Dealership::~Dealership()
{
    // auto deleted here, with reverse order of initialization
}

,但是您有一对新的和已删除的对,因此您应该只检查一次删除。这将需要类(或其静态变量)之外的一些全局计数器,并且可能不如智能指针可读。

如果与此同时使用多个线程,则最好使用shared_ptr和自定义删除器([](T * ptr){delete [] ptr;})作为其第二个构造函数参数。

至少通过这种方式,您可以知道错误是否与新建和删除有关。