我用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'
但它很糟糕,因为它会导致内存泄漏。我想知道在重新指向新阵列之前如何正确释放内存。
答案 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;不会再这样做了:)