C++应用程序在删除时崩溃

C++ application crashes at delete

本文关键字:崩溃 删除 应用程序 C++      更新时间:2023-10-16

我有一个用c++编写的相当复杂的应用程序。我有一个班叫OrderBook。我需要动态地创建一个OrderBook对象数组,所以我所做的是

OrderBook* pOrderBooks; // In header file

在运行时,我将数组创建为

p_OrderBooks = new OrderBook[n]; // n is an integer initialized at run time

这个程序运行良好。但是,当我尝试删除数组时(因为我需要创建一个由pOrderBooks指向的新数组(,程序会崩溃。这就是我删除它的方式。

delete[] p_OrderBooks;

我已经确定车祸的发生正是由于那条线。所以我目前正在做的是在不删除之前分配的内存的情况下重新初始化指针。

//delete[] p_OrderBooks; // <- crash happens here
p_OrderBooks = new OrderBook[k]; // for some 'k'

但这很糟糕,因为会有内存泄漏。我想知道如何在重新指向新数组之前正确释放内存。

您正在分配p_OrderBooks,但正在删除pOrderBooks

如果这只是你文章中的一个简单的拼写错误,那么很可能你超出了这个数组的界限,写入的元素超过了开头或结尾,因此损坏了堆,所以当你试图删除它时它会崩溃

OrderBook的一个或多个析构函数是否可能从析构函数中抛出异常?如果是这样(通常被认为是坏的(,如果不处理,将导致应用程序崩溃。

我发现了这个问题。我将一个指向基类中创建的对象的指针传递给OrderBook对象。

Server* p_Server = new Server(); // Some class
...
pOrderbook[i]->SetServer(p_Server) // <- for i=[0:99]

通过的CCD_ 6被存储在CCD_ 7对象中作为CCD_。

Server* p_ServerBase; // <- in OrderBook.h
...
OrderBook::SetServer(Server* pServer)
{
    p_ServerBase = pServer;
}

然后在OrderBook的发行器中,我试图删除它,p_ServerBase,它仍在基类中使用。

...
~OrderBook()
{
    delete p_ServerBase;
}

以前从未有过这样的经历。我不会再这样做了:(

如果你正在做这样的事情:

订单簿*p_OrderBooks;

int n;

p_OrderBooks=新的OrderBook[n];//这里n包含垃圾

cin>gt;n

删除[]p_OrderBooks;

这里n可以是任何垃圾值,我们不知道它的大小,也许我们开始访问我们不拥有的内存。这可能会有问题。你应该先输入

cin>gt;n

p_OrderBooks=新的OrderBook[n];