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

时间:2014-05-01 14:42:16

标签: c++ arrays new-operator

我用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'

但它很糟糕,因为它会导致内存泄漏。我想知道在重新指向新阵列之前如何正确释放内存。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

OrderBook的一个或多个析构函数是否可能会从析构函数中抛出异常?如果是这样(typically considered bad)并且如果没有处理则会使您的应用程序崩溃。

答案 2 :(得分:1)

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

  

OrderBook * p_OrderBooks;

     

int n;

     

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

     

CIN&GT;将N

     

删除[] p_OrderBooks;

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

  

CIN&GT;将N

     

p_OrderBooks = new OrderBook [n];

答案 3 :(得分:1)

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

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

传递p_Server作为OrderBook存储在p_ServerBase个对象中(比方说)。

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

然后在OrderBook的析构函数中,我试图删除仍在基类中使用的p_ServerBase

...
~OrderBook()
{
    delete p_ServerBase;
}
以前哈文没有那种体验。我&#39;不会再这样做了:)